检查字符串是否为JSON格式

检查字符串是否为JSON格式,第1张

检查字符串是否为JSON格式

有两种选择。从编码的角度来看,最简单的方法就是正常解码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 }        }}

(游乐场链接)



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4931509.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-12
下一篇2022-11-13

发表评论

登录后才能评论

评论列表(0条)

    保存