栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

检查字符串是否为JSON格式

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

检查字符串是否为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 }        }}

(游乐场链接)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380367.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号