Skip to content

Latest commit

 

History

History
411 lines (336 loc) · 8.4 KB

README.md

File metadata and controls

411 lines (336 loc) · 8.4 KB

gojson

buildgo-versionGo Report CardPyPI

一个强大的json框架

💡 简介

gojson是一个支持数据多种方式读取,智能解析,操作便捷的一个json框架

🚀 功能

  • json序列与反序列化
  • json指定字段查找
  • 支持json数据操作 (修改,插入,删除)
  • json数据可视化

🌟 亮点

  • 性能出色
    • json对象相对于其他项目携带的数据(字段)更少
    • 底层使用大量指针
    • 优化的递归函数
  • 功能强大
    • 支持将任意形式(嵌套,指针,切片,数组,map,空接口)的结构体,任意形式的字段(匿名,导出,不可导出)unmarshal成json格式
    • 支持将其他格式(yaml,toml,xml...)的数据转化成json格式
    • 支持从文件读取数据
    • 支持tag校验
    • json友好输出
    • 并发安全
  • 操作便捷
    • 函数链式操作,一直...
    • 智能解析数据,传进去对象就完事辣
    • 函数简洁,所以用户不用对众多的函数选择感到迷茫

⚙ 代码结构

展开查看

    ├── internal  ----------------------(内部工具包)
    	├── conv  ----------------------(数据转换)
    		├── byte.go
    		├── consts.go
    		├── interfaces.go
    		├── map.go
    		├── string.go
    	├── encoding  ------------------(编码包)
    		├── ini
    			├── ini.go
    		├── toml
    			├── toml.go
    		├── xml
    			├── xml.go
    		├── yaml
    			├── yaml.go
    	├── mutex  ---------------------(读写锁)
    		├── mutes.go
    	├── regex  ---------------------(正则匹配)
    		├── regex.go 
    	├── type  ----------------------(类型相关的操作包)
    		├── stringx
    			├── string.go
    		├── reflection
    			├── reflection.go
    		├── structx
    			├── field.go
    			├── structx.go
    ├── const.go  ----------------------(常量定义)
    ├── dump.go  -----------------------(数据可视化相关的函数)
    ├── err.go  ------------------------(错误定义)
    ├── gojson.go  ---------------------(用户可操作函数)
    ├── load.go  -----------------------(数据加载相关的函数)
    ├── operator.go  -------------------(json数据相关的操作函数)
    ├── option.go  ---------------------(选项相关的函数)

🎬 快速开始

创建json对象(初始化)

j:=gojson.New()

json序列化

从对象中加载

// 字符串,[]byte

jsonStr := `{"name": "json", "age": 18}`
yamlStr := `
name: `json`
age: 18
`

j1:=gojson.New().LoadContent(jsonStr)
j2:=gojson.New().LoadContent(yamlStr)

// 结构体
person:= struct {
		name string		
		age int
	}{name: "json",age: 18}
	
j3:=gojson.New().LoadContent(person)

// 切片
sli:=[]interface{}{"json",18,"male"}

j4:=gojson.New().LoadContent(sli)

// map

m:=map[string]interface{}{"name":"json","age":18}

j5:=gojson.New().LoadContent(m)

从文件中加载

path:="./example.txt"
j:=gojson.New().LoadFile(path)

加载时可选选项

//  Options
//  把选项结构体从Json对象分离出来,Json携带的数据更少,性能更优
//  type Options struct {
// 	  Safe           bool   // 需要并发安全时开启,使用读写锁
//	  ContentType    string // 设定数据类型,没有设定需要后面程序来判断
//	  StrNumber      bool   // 是否将数字判断为字符串
//	  LoadUnexported bool   // 是否加载不可导出字段 // TODO: 待支持
//  }
jsonStr := `{"name": "json", "age": 18}`
j:=gojson.New().LoadContentWithOptions(jsonStr, Options{
		Safe:           true,
		ContentType:    "json",
		StrNumber:      true,
		LoadUnexported: false,
	})

json反序列化

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

jsonStr := `{"name": "json", "age": 18}`
j:=gojson.New().LoadContent(jsonStr)
j.Unmarshal(Person)

json可视化

输出json对象

jsonStr := `{"name": "json", "age": 18}`
j:=gojson.New().LoadContent(jsonStr)
j.Dump()
/*
output:
	{
	    mu:          {
	        w:           {
	            state: 0,
	            sema:  0,
	        },
	        writerSem:   0,
	        readerSem:   0,
	        readerCount: 0,
	        readerWait:  0,
	    },
	    JsonContent: {
	        "name": "json",
	        "age":  18,
	    },
	    IsValid:     true,
	}
*/

输出json字符串

jsonStr := `{"name": "json", "age": 18}`
j:=gojson.New().LoadContent(jsonStr)
j.DumpContent()
/*
output:
	{
    	"age":  18,
   	    "name": "json",
	}
*/

可选选项

jsonStr := `{"name": "json", "age": 18}`
j := New().LoadContent(jsonStr)
j.DumpWithOptions(j.JsonContent,DumpOption{
	WithType:     true,
	ExportedOnly: false,
})
/*
output:
	map[string]interface {}(2) {
    	string("name"): string(4) "json",
    	string("age"):  float64(18),
	}
*/

json操作

查找

--------------------------------------------------
jsonStr := `{"name": "json", "age": 18}`
j := New().LoadContent(jsonStr)
fmt.Println(j.Get("name"))
/*
output:
	json
*/
--------------------------------------------------
jsonStr := `
[{
		"name":"json",
		"age":18
	},
	{
		"name":"Bob",
		"age":15
	}
]
`
j := New().LoadContent(jsonStr)
fmt.Println(j.Get("[0].name"))
/*
output:
	json
*/
--------------------------------------------------

修改

jsonStr := `
[{
		"name":"json",
		"age":18
	},
	{
		"name":"Bob",
		"age":15
	}
]
`
j := New().LoadContent(jsonStr)
j.Set("[0].age", 20)
fmt.Println(j.Get("[0].age"))
/*
output:
	20
*/

插入

jsonStr := `
[{
		"name":"json",
		"age":18
	},
	{
		"name":"Bob",
		"age":15
	}
]
`
j := New().LoadContent(jsonStr)
j.Set("[2]", map[string]interface{}{"name": "kate", "age": 21})
j.DumpContent()
/*
output:
	[
    	{
        	"name": "json",
        	"age":  18,
    	},
    	{
        	"name": "Bob",
        	"age":  15,
    	},
    	{
        	"name": "kate",
        	"age":  21,
    	},
	]
*/

删除

jsonStr := `
[{
		"name":"json",
		"age":18
	},
	{
		"name":"Bob",
		"age":15
	}
]
`
j := New().LoadContent(jsonStr)
j.Set("[1]", nil)
j.DumpContent()
/*
output:
	[
    	{
        	"name": "json",
       		"age":  18,
    	},
	]
*/

📊 性能测试

🛠 环境要求

  • golang 版本 >= 1.18

📌 TODO

  • json的序列化

    • string[]byte的序列化

    • json格式

    • 其他类型的格式(tomlyamlxmlini)

      • toml

      • yaml

      • xml

      • ini

    • 结构体序列化

    • 切片,数组序列化

    • map序列化

    • tag校验

    • 从文件读取

    • 发起http请求并读取

  • json的反序列化

    • 映射到结构体
  • json可视化

    • map
    • 切片
    • 结构体
  • json的数据操作

    • 查找
    • 修改
    • 插入
    • 删除

🎈 结语

📔 参考文献

CSDN Golang自定义结构体转map

GitHub structs

GitHub mapstructure

🔑 JetBrains 开源证书支持

感谢JetBrains提供的Goland支持