# 一、概述
```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用例。
写这个开源库没用多久,测试和完善花费的时间更久。后续我还会开源一些有自己想法的方便使用的通用类的工具库。
有疑问加站长微信联系(非本文作者))