在使用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.Unmarshal([]byte(testjson), &jsonBodyRawResult)
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) }
|