使用Golang处理JSON文件的常见方法与技巧

使用Golang处理JSON文件的常见方法与技巧

我是Go语言新手,能否帮我完成以下任务?

1) 假设有一个包含员工ID、姓名和工资的JSON文件,编写程序计算支付给员工的总工资(在网页上显示)

2) 基于上述场景,编写程序显示工资超过5000的员工详细信息(在网页上显示)
21 回复

你能直接实现它吗?

更多关于使用Golang处理JSON文件的常见方法与技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我问的问题和你们说的内容有什么关系?

我不太明白,你能帮忙解释一下吗?

好的,没问题。

谢谢!

我不太明白,所以来这里寻求解答

谢谢!能否也请给第二个问题一些提示?

func main() {
    fmt.Println("hello world")
}

已解决! 当我解组JSON并对结构体进行了操作时。

我不太明白你的意思。你真的期望我们为你编写代码吗?即使这看起来很明显像是作业的情况?

你只是将每个emp的详细信息写入响应。

你尝试过实现计算总和并只写入高薪的逻辑吗?

当然。但我已经知道这是如何运作的。你通过自己尝试、犯错、修正错误来学习,而不是通过看我帮你解决问题来学习。

JSON具体是什么样的?你有没有一些(不)可运行的代码,能展示你目前已经实现的部分以及遇到的困难?

// 代码示例请放在这里

你在哪个环节卡住了?

一般来说,我已经为你的第二个任务提供了四个提示。

你是被其中某个步骤难住了吗?还是在尝试不同的方法?

大致思路是构建一个新切片,仅追加满足特定条件的元素。

之后你只需要输出结果即可。

我刚刚编写了上面的代码,但无法用JSON实现该逻辑,所以在这里发帖求助。我正在学习Go语言,这些只是用来测试我的编码能力,我认为你们会提供帮助而不是评判当前的情况。

这其实很简单。你已经有了 empemp.Salary。现在在 for 循环外定义一个 int 变量来汇总工资。在循环内部将工资累加到这个总和变量中。循环结束后将总和写入 w。这就足够完成你作业的第一部分了。试试看!

那么让我们从简单的第一步开始。

请编写 sum() 函数的实现:

package main

// sum sums the elements of a slice of int
func sum(s []int) int {
  // implement me
}

func main() {
  fmt.Println(sum([1,2,3,4]))
}

这段代码的输出结果应该是 10

看起来有人(你的老师?)给了你一个需要完成的作业。看起来你已经有了一些实现JSON解析和HTTP响应写入的代码。

现在这是的任务来完成剩余部分,我们不会替你完成。你已经尝试过哪些方法来:

  • 计算支付给员工的总薪资
  • 通过写入w来显示总薪资
  • 查找薪资超过5000的员工详细信息
  • 通过写入w来展示这些信息?

仅供参考,Google找到了一个在更短时间内对数字切片求和的方法,这比我实际复制粘贴该解决方案到帖子中并进行格式化所需的时间还要短。

当然你需要知道要搜索什么,但我不仅在这个帖子中,而且在整个讨论串中都给出了必要的关键词。

请记住,我们所有人都是在业余和空闲时间做这些事情,我们也曾经历过你现在所处的阶段。相信我,如果我只是盲目复制粘贴解决方案而不加思考,就不会达到现在的水平——用兼职工作获得全职薪水。

你要求我们帮你完成工作。

我们说,你不会从我们替你写代码中学到东西。

因此,我们尝试给你一些提示,让你自己写出代码。

基本上,我要求你写的是正确汇总 JSON 薪资的第一步。这只是改变 s 的类型以及你如何访问它。

当你准备好这个总和后,将其转换为字符串并写入流就变得很简单了。

对于第二步,在理解了如何正确使用切片之后,过滤切片就像一开始求和一样简单。

同样,将其转换为字符串并写入流也很简单。

但是,如果你对网页有特殊的设计考虑,你需要在另一个更专注于网页设计的论坛中提问。

编程不仅仅是解决问题。它是将大问题分解成小问题,并逐步解决它们。

你需要按顺序解决的问题:

  1. 对数字切片求和
  2. 对结构体切片中指定字段求和
  3. 将数字转换为字符串
  4. 将字符串写入 Writer
  5. 过滤数字切片
  6. 过滤结构体切片
  7. 将结构体切片转换为字符串
  8. 参考第 4 步

但是,如果你仍然坚持让别人写你的代码,我认为 #jobs 是适合的地方,但你可能不会通过这种方式学到太多。

package main
 
import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "strings"
    "net/http"
)
 
func Handle(w http.ResponseWriter,r *http.Request) {
    const jsonStream=  `
				        {"id":1, "Name": "John",  "Salary": 54552}        
				        {"id":2, "Name": "Mark",  "Salary": 98545}
				        {"id":3, "Name": "Sandy", "Salary": 34534}
				        {"id":4, "Name": "Holard","Salary": 34534}
				        `
    type Employee struct {
        id int
        Name string
        Salary int
    }

    dec := json.NewDecoder(strings.NewReader(jsonStream))
    for {
        var emp Employee
        if err := dec.Decode(&emp); err == io.EOF {
            break
        } else if err != nil {
            log.Fatal(err)
        }
        fmt.Fprintf(w,"%d: %s: %d\n", emp.id,emp.Name, emp.Salary)
    }
}

func main(){
	http.HandleFunc("/",Handle)
	http.ListenAndServe(":8080",nil)
}

NobbZ: JSON数据具体是什么样的?你是否有(不)能正常工作的代码来展示你目前的进展和遇到的问题?

如何仅添加所有员工的工资字段并在网页中返回?

以下是使用Golang处理JSON文件并实现所需功能的完整示例代码。该代码通过HTTP服务器在网页上显示结果,假设JSON文件名为employees.json,结构包含员工ID、姓名和工资字段。

1. 定义员工结构体和JSON文件示例

首先,创建一个示例JSON文件employees.json,内容如下:

[
  {"id": 1, "name": "Alice", "salary": 6000},
  {"id": 2, "name": "Bob", "salary": 4500},
  {"id": 3, "name": "Charlie", "salary": 7000}
]

2. 完整Go程序代码

package main

import (
	"encoding/json"
	"fmt"
	"html/template"
	"log"
	"net/http"
	"os"
)

// Employee 结构体定义员工数据
type Employee struct {
	ID     int    `json:"id"`
	Name   string `json:"name"`
	Salary int    `json:"salary"`
}

// 读取JSON文件并解析为Employee切片
func loadEmployees(filename string) ([]Employee, error) {
	file, err := os.ReadFile(filename)
	if err != nil {
		return nil, err
	}

	var employees []Employee
	err = json.Unmarshal(file, &employees)
	if err != nil {
		return nil, err
	}

	return employees, nil
}

// 计算总工资
func calculateTotalSalary(employees []Employee) int {
	total := 0
	for _, emp := range employees {
		total += emp.Salary
	}
	return total
}

// 获取工资超过5000的员工
func getHighSalaryEmployees(employees []Employee, threshold int) []Employee {
	var highSalaryEmployees []Employee
	for _, emp := range employees {
		if emp.Salary > threshold {
			highSalaryEmployees = append(highSalaryEmployees, emp)
		}
	}
	return highSalaryEmployees
}

// 处理根路径,显示总工资和工资超过5000的员工
func homeHandler(w http.ResponseWriter, r *http.Request) {
	employees, err := loadEmployees("employees.json")
	if err != nil {
		http.Error(w, "无法加载员工数据", http.StatusInternalServerError)
		return
	}

	totalSalary := calculateTotalSalary(employees)
	highSalaryEmployees := getHighSalaryEmployees(employees, 5000)

	// 使用HTML模板渲染结果
	tmpl := `
<!DOCTYPE html>
<html>
<head>
    <title>员工工资信息</title>
</head>
<body>
    <h1>员工工资统计</h1>
    <p><strong>总工资:</strong> {{.TotalSalary}}</p>
    
    <h2>工资超过5000的员工</h2>
    <ul>
        {{range .HighSalaryEmployees}}
        <li>ID: {{.ID}}, 姓名: {{.Name}}, 工资: {{.Salary}}</li>
        {{end}}
    </ul>
</body>
</html>
`

	data := struct {
		TotalSalary          int
		HighSalaryEmployees []Employee
	}{
		TotalSalary:          totalSalary,
		HighSalaryEmployees: highSalaryEmployees,
	}

	t, err := template.New("webpage").Parse(tmpl)
	if err != nil {
		http.Error(w, "模板解析错误", http.StatusInternalServerError)
		return
	}

	err = t.Execute(w, data)
	if err != nil {
		http.Error(w, "模板执行错误", http.StatusInternalServerError)
		return
	}
}

func main() {
	http.HandleFunc("/", homeHandler)
	fmt.Println("服务器启动在 http://localhost:8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

3. 运行说明

  • 将上述代码保存为main.go,并确保employees.json文件在同一目录下。
  • 运行命令:go run main.go
  • 在浏览器中访问http://localhost:8080,网页将显示总工资和工资超过5000的员工详细信息。

4. 关键点解释

  • JSON解析:使用encoding/json包解析JSON文件到结构体切片。
  • 计算逻辑:通过循环遍历员工切片计算总工资和筛选高工资员工。
  • Web显示:使用html/template包动态生成HTML页面,避免硬编码HTML字符串。

该代码直接处理了JSON文件读取、数据计算和网页显示,无需额外依赖。

回到顶部