我们在对外提供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 main import ( "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 main import ( "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) } }
输出的结果这样:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持小牛知识库。如有错误或未考虑完全的地方,望不吝赐教。
本文向大家介绍快速解决owin返回json字符串多带了双引号"多了重string转义字符串,包括了快速解决owin返回json字符串多带了双引号"多了重string转义字符串的使用技巧和注意事项,需要的朋友参考一下 解决方法: 以上这篇快速解决owin返回json字符串多带了双引号"多了重string转义字符串就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
问题内容: 我想知道是否有人可以指出我的资源,其中记录了序列化php字符串的详细信息。我基本上想知道格式/结构,因此我可以在VB.NET中编写一个函数以对其进行序列化/反序列化。 谢谢! 问题答案: 基本结构如下: 标量类型: 布尔值序列化为: 其中是一个整数值,其值为(false)或(true)。 整数序列化为: 其中是整数值。 浮点数被序列化为(含义为double): 浮点值在哪里。 字符串被
我想知道是否有人能给我指出一个资源,其中记录了序列化php字符串的详细信息。我基本上想知道格式/结构,这样我就可以在VB.NET中编写一个函数来序列化/反序列化它。 谢了!
我有课 其中field 如果使用ObjectMapper反序列化此对象 结果是这样的: 添加了转义(\),并且json字段有引号(")。如何正确摆脱这一点并制作单个JSON?像这样:
字符串序列化是将对象状态写入字节流的过程。 在python中,“pickle”库用于启用序列化。 该模块包含一个强大的算法,用于序列化和反序列化Python对象结构。 “Pickling”是将Python对象层次结构转换为字节流的过程,“unpickling”是相反的过程。 泡菜模块的演示如下 - import pickle #Here's an example dict grades = { '
问题内容: 我有以下类,它是由Jackson映射的(简化版): 在某些情况下,服务器会返回,然后我想将name设置为空的Java String。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串? 问题答案: 您可以在默认构造函数中或声明时进行设置: 要么