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

mediaufo · · 301 次点击 · · 开始浏览    

​ # 一、概述 ```go 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、序列化/反序列化的接口 ```go 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 接口 ```go 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  等 ```go 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 用法 ```go 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

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