Golang解析JSON二三事

在使用golang编写程序时需要对json数据进行操作,遇到了一些问题在这里总结一下


解析json的部分数据

如果你只是想要json数据中的一小部分,golang支持部分解析和使用json.RawMessage进行解析,例如,如果我获取如下的json数据,但只想获取其中basicInfo的内容,别的不需要

1
2
3
4
5
6
7
{
"basicInfo": {
"name": "schwarzeni",
"age": "21"
},
"skills": ["golang", "javascript"]
}

专门为basicInfo写一个结构体就可以了,如下

1
2
3
4
5
6
type PersonInfo struct {
BasicInfo struct {
Name string `json:"name"`
Age string `json:"age"`
} `json:"basicInfo"`
}

解析的时候直接使用json.Unmarshal就可以了,完整的步骤网上一搜一大把,这里就不写出完整代码了

如果json格式是在是太复杂,而我只想到其中的某个数据,比如说name,那我可以直接使用json.RawMessage来进行解析,实例代码如下

1
2
3
4
5
6
7
8
9
10
11
 var jsonBodyRawResult map[string]*json.RawMessage

// 第一次,解析完整的json
json.Unmarshal([]byte(testjson), &jsonBodyRawResult)

// 二次,解析basicInfo那部分json
json.Unmarshal(*jsonBodyRawResult["basicInfo"], &jsonBodyRawResult)

// 取值
result := string(*jsonBodyRawResult["name"])
fmt.Println(result)

这样也是一种快捷的方法,完整的代码戳此: GO playground,或见文末


读取本地json(尤其是Windows中的)时注意文件编码

貌似golang在读取非utf-8编码的json文件时解析会出问题,我在学校机房的电脑上新建了一个json文件向里面写了一些数据,使用程序读取时怎么也不灵,在自己的电脑上测试都是没问题的,调试了好久

由于vscode支持显示文件编码,我无意间看到这个文件是 UTF-8 with BOM 格式的,不是UTF-8,上网查了一下,那个编码是Windows特色,在utf-8编码的文件之前加了什么东西,如果不加区分的话就会导致读取出错,文字乱码。

所有,在处理和Windows有关的文件时注意提前查看一下文件的编码格式,以免被坑


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import (
"fmt"
"encoding/json"
)

type PersonInfo struct {
BasicInfo struct {
Name string `json:"name"`
Age string `json:"age"`
} `json:"basicInfo"`
}

var testjson = `{"basicInfo": {"name": "schwarzeni","age": "21"}, "skills": ["golang", "javascript"]}`

func main() {
var jsonBodyRawResult map[string]*json.RawMessage
json.Unmarshal([]byte(testjson), &jsonBodyRawResult)
json.Unmarshal(*jsonBodyRawResult["basicInfo"], &jsonBodyRawResult)
result := string(*jsonBodyRawResult["name"])
fmt.Println(result)

var jsonPartialResult PersonInfo
json.Unmarshal([]byte(testjson), &jsonPartialResult)
fmt.Println(jsonPartialResult)
}