时间:2021-05-22
我们在对外提供API接口,返回响应的时候,很多时候需要使用如下的数据结构
type Response struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"`}该API接口返回一个状体码,状态信息,以及具体的值。但是具体的值可能根据各个接口的不同而不同。
在实际的开发过程中我们可能会得到一个实际的数据值,并将这个值赋值给data,然后json序列化返回给调用方。
这时如果你得到的data是一个经过json序列化之后的字符串,类似于{"Name":"happy"},然后再将这个字符串赋值给data,此时将response序列化得到的string,如下
{“code”:1,”msg”:”success”,”data”:”{\”Name\”:\”Happy\”}”}
我们会发现之前已经序列化好的字符串,每一个都多了\,这是因为转义引起的问题。
直接将未序列化的data赋值给data
package mainimport ( "encoding/json" "fmt")type Response struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"`}type People struct { Name string}func main() { data := People{Name: "happy"} response := &Response{ Code: 1, Msg: "success", Data: data, } b, err := json.Marshal(&response) if err != nil { fmt.Println("err", err) } fmt.Println(string(b))}使用json 的RawMessage 将转义后的string,赋值给data
package mainimport ( "encoding/json" "fmt")type Response struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"`}type People struct { Name string}func main() { data := `{"Name":"Happy"}` response := &Response{ Code: 1, Msg: "success", Data: json.RawMessage(data), } b, err := json.Marshal(&response) if err != nil { fmt.Println("err", err) } fmt.Println(string(b))}通过使用json的json.RawMessage(data)函数将其转换一下,这样也能保证不存在转义符。
补充:golang string转json的一些坑
大佬们都知道怎么在string中给string类型赋值带双引号的字符串,没错就是用反斜杠,如下:
msg := "{\"name\":\"zhangsan\", \"age\":18, \"id\":122463, \"sid\":122464}"
但是golang还支持另外一个符号,我初学时候以为是单引号,但其实不是,是esc键下边那个,那么赋值带双引号的字符串就如下就行了:
ret := `{"access_token":"uAUS6o5g-9rFWjYt39LYa7TKqiMVsIfCGPEN4IZzdAk5-T-ryVhL7xb8kYciuU_m","expires_in":7200}`
先看一段代码,起作用是把字符串转换为结构体对应的json
type people struct { name string `json:"name"` age int `json:"age"` id int `json:"id"`}type student struct { people id int `json:"sid"`}func main() { msg := "{\"name\":\"zhangsan\", \"age\":18, \"id\":122463, \"sid\":122464}" var someOne student if err := json.Unmarshal([]byte(msg), &someOne); err == nil { fmt.Println(someOne) fmt.Println(someOne.people) } else { fmt.Println(err) }}仔细看看,有没有错?我只能说,这样是输出不出来答案的,赋值错误,看下面的运行结果:
伤脑筋啊,我仔细看了半天,发现在定义的people和student两个结构体下边有绿色的波浪线(我用的vscode),像下边这样:
鼠标放上去显示的是:
大家都知道,golang中变量声明成大写和小写能引用的范围是不一样的,那我就想了,大小写问题???一脸懵逼把变量名首字母改成了大写,然后...就行了,代码变成了下边这样:
type people struct { Name string `json:"name"` Age int `json:"age"` ID int `json:"id"`}type student struct { people ID int `json:"sid"`}func main() { msg := "{\"name\":\"zhangsan\", \"age\":18, \"id\":122463, \"sid\":122464}" var someOne student if err := json.Unmarshal([]byte(msg), &someOne); err == nil { fmt.Println(someOne) fmt.Println(someOne.people) } else { fmt.Println(err) }}输出的结果这样:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#格式化json字符串的方法。分享给大家供大家参考,具体如下:将Json字符串转化成格式化表示的方法:字符串反序列化为对象-->对象再序列化为字
序列化定义指将JavaScript值转化为JSON字符串的过程。JSON.stringify()能够将JavaScript值转换成JSON字符串。JSON.st
0.前言对象的序列化和反序列化作用就不再赘述,php中序列化的结果是一个php自定义的字符串格式,有点类似json.我们在任何语言中设计对象的序列化和反序列化都
Gson反序列化原理原理简述gson反序列化主要分为两个过程:根据TypeToken创建出对象根据json字符串解析数据,对对象属性赋值对象的创建Constru
全局引用usingNewtonsoft.Json;usingNewtonsoft.Json.Converters;//把Json字符串反序列化为对象目标对象=J