请教一个有关 gin 返回包含未知属性的嵌套 JSON 的问题

2020-05-09 09:35:18 +08:00
 JustSong

如题,现在我们要返回这样的一个 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 相关的信息,但是好像都需要绑定到一个结构体,但是属性完全未知的情况下要怎么搞呢?

2488 次点击
所在节点    Go 编程语言
11 条回复
insert000
2020-05-09 09:36:45 +08:00
用 map
pubby
2020-05-09 09:45:24 +08:00
data json.RawMessage
kaifang
2020-05-09 09:47:46 +08:00
将字符串转成 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)
JustSong
2020-05-09 10:04:34 +08:00
谢谢大家,贴一下解决方案,供参考:

```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(),
})
}
```
yiplee
2020-05-09 10:26:54 +08:00
用 json.RawMessage 就好了转 map 是浪费

```go
c.JSON( http.StatusOK, gin.H{
"message": "ok",
"data": json.RawMessage(data.Data),
})
```
ClarkAbe
2020-05-09 10:39:29 +08:00
先把你的 data.Data 序列化成 map 然后再....
eslizn
2020-05-09 10:44:55 +08:00
data 用 interface{} 针对不同的内容设计不同的结构体,用 map 真的不合适
lewinlan
2020-05-09 11:16:09 +08:00
data.Data 已经是字符串了,你就用 c.string 返回啊,加个返回头。为啥还要反序列化??
labulaka521
2020-05-09 11:53:45 +08:00
同意楼上,直接构造个 json 字符串返回就好了,不用转来转去
huayumo
2020-05-09 12:07:02 +08:00
对,就是楼上说的那样
jituixiong
2020-05-09 12:27:08 +08:00
楼上正解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/669866

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX