
有两种选择。从编码的角度来看,最简单的方法就是正常解码JSON字符串。您可以通过解码为空结构来提高效率:
package mainimport "encoding/json"func main() { input := []byte(`{"a":"b", "c": 123}`) var x struct{} if err := json.Unmarshal(input, &x); err != nil { panic(err) } input = []byte(`{"a":"b", "c": 123}xxx`) // This one fails if err := json.Unmarshal(input, &x); err != nil { panic(err) }}(游乐场链接)
此方法有一些潜在的缺点:
- 它仅适用于单个JSON对象。也就是说,没有附加逻辑的情况下,对象列表(按问题的要求)将失败。
- 正如@icza在评论中指出的那样,它仅适用于JSON对象,因此裸露的数组,数字或字符串将失败。为了适应这些类型,
interface{}必须使用它,这可能会导致严重的性能损失。 - 该扔掉的
x
值仍必须进行分配,以及至少一个反射调用是有可能的纸张,其可能引入显着的性能损失一些工作负载下。
鉴于这些限制,我的建议是使用第二个选项:遍历整个JSON输入,而忽略实际内容。使用标准库json.Deprer可简化此 *** 作:
package mainimport ( "bytes" "encoding/json" "io")func main() { input := []byte(`{"a":"b", "c": 123}`) dec := json.NewDeprer(bytes.NewReader(input)) for { _, err := dec.Token() if err == io.EOF { break // End of input, valid JSON } if err != nil { panic(err) // Invalid input } } input = []byte(`{"a":"b", "c": 123}xxx`) // This input fails dec = json.NewDeprer(bytes.NewReader(input)) for { _, err := dec.Token() if err == io.EOF { break // End of input, valid JSON } if err != nil { panic(err) // Invalid input } }}(游乐场链接)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)