如题,现在我们要返回这样的一个 JSON:
c.JSON( http.StatusOK, gin.H{
"message": "ok",
"data": data.Data,
})
其中 data.Data 是一个 JSON 字符串,例如:"{\r\n \"name\": \"smzddddddddddddddd\",\r\n \"age\": 66666666666\r\n}"
现在我们得到的返回是这样的:
{
"data": "{\r\n \"name\": \"smzddddddddddddddd\",\r\n \"age\": 66666666666\r\n}",
"message": "ok"
}
而我想得到这样的:
{
"data": {
"name":"smzddddddddddddddd",
"age":66666666666
},
"message": "ok"
}
难点在于 data 的属性是完全未知的,我已经尝试搜索过 gin return nested json
相关的信息,但是好像都需要绑定到一个结构体,但是属性完全未知的情况下要怎么搞呢?
1
insert000 2020-05-09 09:36:45 +08:00 1
用 map
|
2
pubby 2020-05-09 09:45:24 +08:00 via Android 1
data json.RawMessage
|
3
kaifang 2020-05-09 09:47:46 +08:00 1
将字符串转成 map
s := "{\r\n \"name\": \"smzddddddddddddddd\",\r\n \"age\": 66666666666\r\n}" var m map[string]interface{} if err:=json.Unmarshal([]byte(s),&m);err!=nil{ fmt.Println(err.Error()) } fmt.Println(m) |
4
JustSong OP 谢谢大家,贴一下解决方案,供参考:
```go data, err := Query(path) var jsonData map[string]interface{} if err == nil { message := "ok" if data != nil { if e := json.Unmarshal([]byte(data.Data), &jsonData); e != nil { message = e.Error() } } else { message = "data is nil but err is not nil" } c.JSON( http.StatusOK, gin.H{ "message": message, "data": jsonData, }) } else { c.JSON( http.StatusInternalServerError, gin.H{ "message": err.Error(), }) } ``` |
5
yiplee 2020-05-09 10:26:54 +08:00 1
用 json.RawMessage 就好了转 map 是浪费
```go c.JSON( http.StatusOK, gin.H{ "message": "ok", "data": json.RawMessage(data.Data), }) ``` |
6
ClarkAbe 2020-05-09 10:39:29 +08:00 via iPhone 1
先把你的 data.Data 序列化成 map 然后再....
|
7
eslizn 2020-05-09 10:44:55 +08:00 1
data 用 interface{} 针对不同的内容设计不同的结构体,用 map 真的不合适
|
8
lewinlan 2020-05-09 11:16:09 +08:00 via Android 1
data.Data 已经是字符串了,你就用 c.string 返回啊,加个返回头。为啥还要反序列化??
|
9
labulaka521 2020-05-09 11:53:45 +08:00 via Android 1
同意楼上,直接构造个 json 字符串返回就好了,不用转来转去
|
10
huayumo 2020-05-09 12:07:02 +08:00 1
对,就是楼上说的那样
|
11
jituixiong 2020-05-09 12:27:08 +08:00 via Android 1
楼上正解
|