zoukankan      html  css  js  c++  java
  • 一个非常棒的Go-Json解析库

    json是一种数据格式,经常被用作数据交换,页面展示,序列化等场景,基本每种语言都有对应的json解析框架,Go语言也不例外,并且内置了json库,基本能够满足一些普通开发场景,但有些复杂场景下就不太理想了,因此找一个好用的开源的json库就非常有必要了,先放地址

    https://github.com/bitly/go-simplejson
    

    内置json库的使用

    我们创建一个如下结构体,用来测试内置json库和开源的json库,一起看看使用上是来怎么操作的呢?

    //omitempty  这个属性可以在序列化时忽略0值和nil值
    // score 不能序列化,属于私有字段
    type Student struct {
        Id       int                `json:"id"` //如果想json后的id是字符串可以这样写  `json:"id,string"`
        Name     string             `json:"name"`
        Age      int                `json:"age"`
        score    map[string]float32 `json:"score"`
        Phone    string             `json:"phone,omitempty"`
        Birthday JsonTime           `json:"birthday"`
    }
    

    内置的json库基本上就两个方法 ToJson和FromJson,把一个对象转换为json字符串,把json字符串转化为对象,如下两个api,如果我们想要从json字符串中获取某个key时,或者想要知道某个value的类型时,此时内置库就不支持了,我们就需要想别的办法了

    result, err := json.Marshal(v interface{})
    err := json.Unmarshal(jsonStr []byte, v interface{})
    //序列化
    func ToJson(v interface{}) (string, error) {
        result, err := json.Marshal(v)
        if err != nil {
            return "", nil
        }
        return string(result), nil
    }
    //反序列化
    func FromJson(jsonStr []byte, v interface{}) error {
        err := json.Unmarshal(jsonStr, v)
        if err != nil {
            log.Fatalln(err)
            return err
        }
        return nil
    }
    

    simple-json的使用

    这个框架使用起来非常简单,并且源码也非常简洁,只有三个源码文件,三个测试文件,感兴趣的同学可以研究下源码实现,simple-json是一个json解析库,就是说对json字符串进行解析,本身不支持序列化和反序列化
    我们构造一个json字符串,然后使用simple-json根据我们的场景来解析这个字符串,得到我们想要的结果

    s := `{
            "tagA" : "json string",
            "tagB" : 1024,
            "tagD" : {
                "tagE":1000
            },
            "tagF":[
                "json array",
                1024,
                {"tagH":"json object"}
            ]
    }`
    

    首先我们获取一个json实例,框架本身支持多种方法获取一个json实力,可以直接创建,也可以在创建时直接指定一个json字符串,也可以通过文件的形式创建,这里我们使用使用第二种方式,也就是使用上面代码中的json2

    json1 := simplejson.New()
    json2 := simplejson.NewJson(bs [] byte)
    json3 := simplejson.NewFromReader(r io.Reader)
    

    1、第一个场景,获取key时tagA的值,下面代码中Get方法返回的还是Json实例,想要具体的值,得转换成值所对应得类型,假设我们已经知道这个值的类型,那么直接.String()就得到结果了

    tagAValue ,err := json2.Get("tagA").String()
    

    2、第二个场景, 获取数组中的key为tagH的值,首先获取tagF,返回Json实例,对应的是一个数组,获取下标为2的Json实例,再从这个Json实例中获取key为tagH的value
    j,err := json2.Get("tagF").GetIndex(2).Get("tagH").String()
    3、第三个场景,检查某一个key是否存在,第一个反馈的值是json实例,第二个返回的值是bool类型,true代表存在,false代表不存在,如果存在我们可以通过json实例直接转换成值的类型

    if json, ok := json2.CheckGet("tagD"); ok { //true ,有该字段
        result,_ := json.String()
        fmt.Println(ok, result)
    }
    

    4、第四个场景,获取嵌套的key,simple-json提供了按照路径搜索的方法,也就是一层一层往下查找,每一层都是一个json实例,如下我们获取tagE

    k, err := json2.GetPath("tagD", "tagE").Int64()
    

    5、还有一个其他场景,比如删除一个key,获取key的时候返回默认值等

    //删除key是tagA值
    json2.Del("tagA")
    //获取key是tagC的值,如果不存在,一定返回一个默认的字符串,当然也可以返回默认的bool值,int值,等
    n := json2.Get("tagC").MustString("default")
    

    simple-json的其他更多方法,使用场景大家可以更多地深入研究,欢迎留言探讨

  • 相关阅读:
    Elementary Methods in Number Theory Exercise 1.3.13
    Elementary Methods in Number Theory Exercise 1.3.17, 1.3.18, 1.3.19, 1.3.20, 1.3.21
    数论概论(Joseph H.Silverman) 习题 5.3,Elementary methods in number theory exercise 1.3.23
    Elementary Methods in Number Theory Exercise 1.2.31
    数论概论(Joseph H.Silverman) 习题 5.3,Elementary methods in number theory exercise 1.3.23
    Elementary Methods in Number Theory Exercise 1.3.13
    Elementary Methods in Number Theory Exercise 1.3.17, 1.3.18, 1.3.19, 1.3.20, 1.3.21
    Elementary Methods in Number Theory Exercise 1.2.31
    Elementary Methods in Number Theory Exercise 1.2.26 The Heisenberg group
    4__面向对象的PHP之作用域
  • 原文地址:https://www.cnblogs.com/sy270321/p/14324784.html
Copyright © 2011-2022 走看看