一个简单实用的go的开源json库nGoJsons

mediaufo · 2024-10-15 21:36:42 · 789 次点击 · 预计阅读时间 5 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2024-10-15 21:36:42 的文章,其中的信息可能已经有所发展或是发生改变。

一、概述

nGoJsons是一个集成方便应用层使用的Json库,是一个内部有内嵌的自研的Json库。

让应用层有更多的选择和方便使用。即有浅层的封装,也有自我特色的自研的Json库。

二、特点

  • 兼容官方 sdk的 Json接口
  • 获取部分Json的解析数据

三、集成的开源库

3.1、序列化和反序列化支持的开源库

  • Stdlib
  • go-json
  • json-iterator
  • sonic

3.2、Parse - Get 支持的开源库

  • fastjson
  • json-iterator
  • sonic
  • SimpleJson
  • jsonparser
  • ngeyjson

其中 ngeyjson是我自研的json库,目前只开放了Get接口部分。

四、统一的接口

4.1、序列化/反序列化的接口

type Decoder interface {
    Decode(val interface{}) error
    Buffered() io.Reader
    DisallowUnknownFields()
    More() bool
    UseNumber()
}

type Encoder interface {
    Encode(val interface{}) error
    SetEscapeHTML(on bool)
    SetIndent(prefix, indent string)
}

HTMLEscape
Marshal
MarshalIndent
Indent
Valid
Unmarshal
NewDecoder
NewEncoder

4.2、Parse - Get 接口

type IJsonParseRet interface {
    Get(key string) IJsonParseRet
    Array() ([]IJsonParseRet, error)

    Bool() (bool, error)

    String() (string, error)
    Float64() (float64, error)
    Int() (int, error)
    Uint() (uint, error)
    Int64() (int64, error)
    Uint64() (uint64, error)
}

五、用法

5.1、Marshal/Unmarshal 等

func testMarshal() {
    var s = struct {
        Name string
        Age  int
    }{
        "json",
        30,
    }

    fmt.Println("-----  Marshal Default Test -------")
    retbytes, err := nGoJsons.Marshal(&s)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(retbytes))

    fmt.Println("-----  Marshal StdlibJsonFrame Test -------")
    retbytes, err = nGoJsons.Marshal(&s, nGoJsons.SetJsonFrame(nGoJsons.StdlibJsonFrame))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(retbytes))

    fmt.Println("-----  Marshal GoJsonFrame Test -------")
    retbytes, err = nGoJsons.Marshal(&s, nGoJsons.SetJsonFrame(nGoJsons.GoJsonFrame))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(retbytes))

    fmt.Println("-----  Marshal SonicJsonFrame Test -------")
    retbytes, err = nGoJsons.Marshal(&s, nGoJsons.SetJsonFrame(nGoJsons.SonicJsonFrame))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(retbytes))

    fmt.Println("-----  Marshal JsonIterJsonFrame Test -------")
    retbytes, err = nGoJsons.Marshal(&s, nGoJsons.SetJsonFrame(nGoJsons.JsonIterJsonFrame))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(retbytes))
}

5.2、Get 用法

func TestJson1(t *testing.T) {
    s := []byte(`{"name":{"first":"Janet","last":"Prichard"},"age":47}`)

    var fn = func(v ijsoner.IJsonParseRet) {
        defer func() { JsonParse.ReleaseCache(v) }()

        vstr, err := v.String()
        if err != nil {
            t.Fatal(err)
        }
        t.Log(vstr)

        vstr, err = v.Get("name").String()
        if err != nil {
            t.Fatal(err)
        }
        t.Log(vstr)

        str, err := v.Get("name").Get("first").String()
        if err != nil {
            t.Fatal(err)
        }
        t.Log(str)

        str, err = v.Get("name").Get("last").String()
        if err != nil {
            t.Fatal(err)
        }
        t.Log(str)

        age, err := v.Get("age").Int()
        if err != nil {
            t.Fatal(err)
        }
        t.Log(age)
    }

    t.Run("testDefaultParse", func(t *testing.T) {
        v, err := JsonParse.Parse(s)
        if err != nil {
            t.Fatalf("unexpected error: %s", err)
        }
        fn(v)
    })

    t.Run("testSimpleJsonParse", func(t *testing.T) {
        v, err := JsonParse.Parse(s, JsonParse.SetParseFrame(JsonParse.SimpleJsonFrame))
        if err != nil {
            t.Fatalf("unexpected error: %s", err)
        }
        fn(v)
    })

    t.Run("testFastJsonParse", func(t *testing.T) {
        v, err := JsonParse.Parse(s, JsonParse.SetParseFrame(JsonParse.FastJsonFrame))
        if err != nil {
            t.Fatalf("unexpected error: %s", err)
        }
        fn(v)
    })

    t.Run("testGeyJsonParse", func(t *testing.T) {
        v, err := JsonParse.Parse(s, JsonParse.SetParseFrame(JsonParse.GeyJsonFrame))
        if err != nil {
            t.Fatalf("unexpected error: %s", err)
        }
        fn(v)
    })

    t.Run("testJsonIterParse", func(t *testing.T) {
        v, err := JsonParse.Parse(s, JsonParse.SetParseFrame(JsonParse.JsonIterFrame))
        if err != nil {
            t.Fatalf("unexpected error: %s", err)
        }
        fn(v)
    })

    t.Run("testJsonParser", func(t *testing.T) {
        v, err := JsonParse.Parse(s, JsonParse.SetParseFrame(JsonParse.JsonParserFrame))
        if err != nil {
            t.Fatalf("unexpected error: %s", err)
        }
        fn(v)
    })

    t.Run("testSonicJsonParse", func(t *testing.T) {
        v, err := JsonParse.Parse(s, JsonParse.SetParseFrame(JsonParse.SonicFrame))
        if err != nil {
            t.Fatalf("unexpected error: %s", err)
        }
        fn(v)
    })
}

六、结束语

欢迎大家通过 github 来下载 github.com/bcwtlch/nGoJsons , 通过进一步的使用来完善这个开源库。主要的出发点是方便大家来使用。github.com上有详细的说明使用和demo用例。

写这个开源库没用多久,测试和完善花费的时间更久。后续我还会开源一些有自己想法的方便使用的通用类的工具库。


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

789 次点击  
加入收藏 微博
1 回复  |  直到 2024-11-25 11:58:20
LIGUANGYAO
LIGUANGYAO · #1 · 4月之前

学习了,能下载系统源码吗,有go开发的小程序案例吗,或者能免费下载源码能也行

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传