new package: nazajson

pull/2/head
q191201771 5 years ago
parent 09421c2b98
commit e01dda7218

4
.gitignore vendored

@ -1,6 +1,6 @@
coverage.txt
coverage.html
profile.out
profile.out*
tmp
/.idea
@ -9,4 +9,4 @@ tmp
/pre-commit.sh
/TODO.md
profile.out*
/pkg/tag

@ -30,12 +30,13 @@ Go语言基础库
pkg/ ......源码包
|-- assert/ ......提供了单元测试时的断言功能,减少一些模板代码
|-- bele/ ......提供了大小端的转换操作
|-- bininfo/ ......将编译时的git版本号时间Go编译器信息打入程序中
|-- bininfo/ ......将编译时的 git 版本号时间Go 编译器信息打入程序中
|-- connection/ ......对 net.Conn 接口的二次封装
|-- log/ ......日志库
|-- mockserver ......模拟一些服务端,用于快速测试其它代码
|-- mockwriter ......模拟 Writer 接口,用于快速测试其它代码
|-- unique/ ......对象唯一ID
|-- mockserver/ ......模拟一些服务端,用于快速测试其它代码
|-- mockwriter/ ......模拟 Writer 接口,用于快速测试其它代码
|-- nazajson/ ......json 操作
|-- unique/ ......对象唯一 ID
demo/ ......示例相关的代码
bin/ ......可执行文件编译输出目录
```

@ -0,0 +1,44 @@
package nzjson
import (
"encoding/json"
"strings"
)
type JSON struct {
//raw []byte
m map[string]interface{}
}
func New(raw []byte) (JSON, error) {
var j JSON
err := j.Init(raw)
return j, err
}
func (j *JSON) Init(raw []byte) error {
return json.Unmarshal(raw, &j.m)
}
func (j *JSON) Exist(path string) bool {
return exist(j.m, path)
}
func exist(m map[string]interface{}, path string) bool {
ps := strings.Split(path, ".")
if len(ps) > 1 {
v, ok := m[ps[0]]
if !ok {
return false
}
mm, ok := v.(map[string]interface{})
if !ok {
return false
}
return exist(mm, ps[1])
}
_, ok := m[ps[0]]
return ok
}

@ -0,0 +1,118 @@
package nzjson
import (
"github.com/q191201771/nezha/pkg/assert"
"github.com/q191201771/nezha/pkg/log"
"testing"
)
var raw = []byte(`
{
"num": 1,
"num2": 0,
"flag": true,
"flag2": false,
"str": "aaa",
"str2": "",
"obj": {
"onum": 2,
"onum3": 0,
"oflag": true,
"oflag3": false,
"ostr": "bbb",
"ostr3": ""
},
"arr": [],
"arr2": [1, 2]
}
`)
func TestExist(t *testing.T) {
var exist bool
j, err := New(raw)
assert.Equal(t, nil, err)
exist = j.Exist("num")
assert.Equal(t, true, exist)
exist = j.Exist("flag")
assert.Equal(t, true, exist)
exist = j.Exist("str")
assert.Equal(t, true, exist)
exist = j.Exist("num2")
assert.Equal(t, true, exist)
exist = j.Exist("flag2")
assert.Equal(t, true, exist)
exist = j.Exist("str2")
assert.Equal(t, true, exist)
exist = j.Exist("arr")
assert.Equal(t, true, exist)
exist = j.Exist("arr2")
assert.Equal(t, true, exist)
exist = j.Exist("obj")
assert.Equal(t, true, exist)
exist = j.Exist("obj.onum")
assert.Equal(t, true, exist)
exist = j.Exist("obj.oflag")
assert.Equal(t, true, exist)
exist = j.Exist("obj.ostr")
assert.Equal(t, true, exist)
exist = j.Exist("obj.onum3")
assert.Equal(t, true, exist)
exist = j.Exist("obj.oflag3")
assert.Equal(t, true, exist)
exist = j.Exist("obj.ostr3")
assert.Equal(t, true, exist)
exist = j.Exist("notexist")
assert.Equal(t, false, exist)
exist = j.Exist("notexist.notexist")
assert.Equal(t, false, exist)
exist = j.Exist("obj.notexist")
assert.Equal(t, false, exist)
exist = j.Exist("obj.notexist.notexist")
assert.Equal(t, false, exist)
exist = j.Exist("num.notexist")
assert.Equal(t, false, exist)
exist = j.Exist(".")
assert.Equal(t, false, exist)
exist = j.Exist("..")
assert.Equal(t, false, exist)
}
func BenchmarkExist(b *testing.B) {
var exist bool
j, _ := New(raw)
for i := 0; i < b.N; i++ {
exist = j.Exist("num")
exist = j.Exist("flag")
exist = j.Exist("str")
exist = j.Exist("obj")
exist = j.Exist("obj.onum")
exist = j.Exist("obj.oflag")
exist = j.Exist("obj.ostr")
exist = j.Exist("notexist")
exist = j.Exist("obj.notexist")
exist = j.Exist("obj.notexist.notexist")
exist = j.Exist(".")
exist = j.Exist("..")
}
log.Debug(exist)
}
Loading…
Cancel
Save