如题所述
第1个回答 2022-07-11
Go解析json遇到了大数字、不定格式等特殊情况,在此做了一个整理。
选择哪个要视输入而定。
json.Unmarshal 操作对象是一个 []byte ,也就意味着被处理的JSON要全部加载到内存。如果有一个加载完的JSON使用 json.Unmarshal 会快一些。
json.Decoder 操作的是一个 stream ,或者其他实现了 io.Reader 接口的类型。意味着可以在接收或传输的同时对其进行解析。当处理一组较大数据时无需重新copy整个JSON到内存中。
最好的选择办法如下:
默认情况下,go对json解析过程中遇到的数字都会当做float64处理。如果数字过大会有精度丢失。可以使用json.Number来处理。
输出结果:
使用 json.Decoder 只能操作 io.Reader 类型的JSON数据。
有时候遇到字段不定的JSON,需要一边判断一边解析。如:
可以先统一解组到interface{} 然后判断关键字段再进行后续处理。
结果
使用RawMessage便于分步Unmarshal
原文链接
选择哪个要视输入而定。
json.Unmarshal 操作对象是一个 []byte ,也就意味着被处理的JSON要全部加载到内存。如果有一个加载完的JSON使用 json.Unmarshal 会快一些。
json.Decoder 操作的是一个 stream ,或者其他实现了 io.Reader 接口的类型。意味着可以在接收或传输的同时对其进行解析。当处理一组较大数据时无需重新copy整个JSON到内存中。
最好的选择办法如下:
默认情况下,go对json解析过程中遇到的数字都会当做float64处理。如果数字过大会有精度丢失。可以使用json.Number来处理。
输出结果:
使用 json.Decoder 只能操作 io.Reader 类型的JSON数据。
有时候遇到字段不定的JSON,需要一边判断一边解析。如:
可以先统一解组到interface{} 然后判断关键字段再进行后续处理。
结果
使用RawMessage便于分步Unmarshal
原文链接