最近尝试做go项目,发现要将json转换到对象,go原生的方式,需要添加标签json:"xxx" ,此外还有强类型问题,比如json中是int类型,用int8接收就不行,因此自己就做了个工具,不需要json标签情况下,就可以将数据转换到对象上
链接:https://github.com/simonalong/tools 请注意:目前工具还在打磨中,大部分类型支持转换简化代码没啥问题,只是个别类型还不支持转换:比如指针
type AppManagerUpdateReq struct {
Id int64 `json:"id"`
AppName string `json:"appName"`
AppDesc string `json:"appDesc"`
ActiveStatus int8 `json:"activeStatus"`
}
为了去掉后面的json,这里做了反解析化工具。提供api进行转换
MapToObject map ——> 对象
ArrayToObject array ——> 对象
StrToObject 字符 ——> 对象
ReaderJsonToObject io.Reader ——> 对象
DataToObject:这个是总况 总数据 ——> 对象
ObjectToJson 对象 ——>json字符
ObjectToData:这个是总的 对象 ——>转换后的对象
提示:
这里的转换支持如下三种特性
- 无json标示:反解析不需要添加’json:“xxx”’,而且反解析时候对应的map中的key为消息
- 类型无限制:map中对应的类型只要能转换进去即可,比如:map中的value值为string类型,但是存储的是数字,实体为int,也是可以的
- 自定义类型:比如自定义类型
type myType int8 这种类型修饰的也可以转换
举例
1. 无json:"xxx" 解析:json到对象
type ValueInnerEntityT struct {
AppName string
Age int
}
func TestMapToObjectT(t *testing.T) {
inner1 := map[string]interface{}{}
inner1["appName"] = "inner_1"
inner1["age"] = 1
var targetObj ValueInnerEntityT
util.MapToObject(inner1, &targetObj)
Equal(t, util.ToJsonString(targetObj), "{\"AppName\":\"inner_1\",\"Age\":1}")
}
嵌套结构也支持
type ValueInnerEntity1 struct {
Name string
Age int
}
type ValueInnerEntity2 struct {
Name string
Age int
Inner1 ValueInnerEntity1
}
func TestMapToObject2(t *testing.T) {
inner1 := map[string]interface{}{}
inner1["name"] = "inner_1"
inner1["age"] = 1
inner2 := map[string]interface{}{}
inner2["name"] = "inner_2"
inner2["age"] = 2
inner2["inner1"] = inner1
var targetObj ValueInnerEntity2
util.MapToObject(inner2, &targetObj)
Equal(t, "{\"Name\":\"inner_2\",\"Age\":2,\"Inner1\":{\"Name\":\"inner_1\",\"Age\":1}}", util.ToJsonString(targetObj))
}
2. 无json:"xxx" 解析:对象到json
type ValueObjectTest1 struct {
AppName string
Age int
}
func TestObjectToJson1(t *testing.T) {
entity := ValueObjectTest1{AppName: "zhou", Age: 12}
Equal(t, util.ObjectToJson(entity), "{\"age\":12,\"appName\":\"zhou\"}")
}
结果
{
"age":12,
"appName":"zhou"
}
复杂结构
type ValueObjectTest3 struct {
AppName []string
Age1 map[string]interface{}
}
type ValueObjectTest4 struct {
AppName string
Inner ValueObjectTest3
}
func TestObjectToJson4(t *testing.T) {
var arrays []string
arrays = append(arrays, "zhou")
arrays = append(arrays, "wang")
dataMap := map[string]interface{}{}
dataMap["a"] = 1
dataMap["b"] = 2
entity3 := ValueObjectTest3 {
AppName: arrays,
Age1: dataMap,
}
var entity4 ValueObjectTest4
entity4.Inner = entity3
entity4.AppName = "zhou"
Equal(t, util.ObjectToJson(entity4), "{\"appName\":\"zhou\",\"inner\":{\"age1\":{\"a\":1,\"b\":2},\"appName\":[\"zhou\",\"wang\"]}}")
}
结果
{
"appName":"zhou",
"inner":{
"age1":{
"a":1,
"b":2
},
"appName":[
"zhou",
"wang"
]
}
}
3. 类型兼容(互转)
如下string类型也可以转换为int
type ValueInnerEntityTem struct {
Name string
Age int
}
func TestMapToObjectTem(t *testing.T) {
inner1 := map[string]interface{}{}
inner1["name"] = "inner_1"
inner1["age"] = "123"
var targetObj ValueInnerEntity1
_ = util.MapToObject(inner1, &targetObj)
Equal(t, "{\"Name\":\"inner_1\",\"Age\":123}", util.ToJsonString(targetObj))
}
4. 支持自定义类型
type MyEnum int
type ValueInnerEntityTem struct {
Name string
Age MyEnum
}
func TestMapToObjectTem(t *testing.T) {
inner1 := map[string]interface{}{}
inner1["name"] = "inner_1"
inner1["age"] = "1"
var targetObj ValueInnerEntity1
_ = util.MapToObject(inner1, &targetObj)
Equal(t, util.ToJsonString(targetObj), "{\"Name\":\"inner_1\",\"Age\":1}")
}
|