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

发布于 1周前 作者 itying888 来自 Go语言

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

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


更多关于Golang Go语言中请教一个有关 gin 返回包含未知属性的嵌套 JSON 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

用 map

更多关于Golang Go语言中请教一个有关 gin 返回包含未知属性的嵌套 JSON 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


data json.RawMessage

将字符串转成 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)

谢谢大家,贴一下解决方案,供参考:

go<br> data, err := Query(path)<br> var jsonData map[string]interface{}<br> if err == nil {<br> message := "ok"<br> if data != nil {<br> if e := json.Unmarshal([]byte(data.Data), &amp;jsonData); e != nil {<br> message = e.Error()<br> }<br> } else {<br> message = "data is nil but err is not nil"<br> }<br> c.JSON( http.StatusOK, gin.H{<br> "message": message,<br> "data": jsonData,<br> })<br> } else {<br> c.JSON( http.StatusInternalServerError, gin.H{<br> "message": err.Error(),<br> })<br> }<br>

用 json.RawMessage 就好了转 map 是浪费

go<br>c.JSON( http.StatusOK, gin.H{<br> "message": "ok",<br> "data": json.RawMessage(data.Data),<br>})<br>

先把你的 data.Data 序列化成 map 然后再…

data 用 interface{} 针对不同的内容设计不同的结构体,用 map 真的不合适

data.Data 已经是字符串了,你就用 c.string 返回啊,加个返回头。为啥还要反序列化??

同意楼上,直接构造个 json 字符串返回就好了,不用转来转去

对,就是楼上说的那样

在 Golang 中使用 Gin 框架返回包含未知属性的嵌套 JSON 时,你可以借助 map[string]interface{} 类型来处理。这种类型允许你存储键值对,其中键是字符串类型,值是任意类型(包括嵌套的结构体、数组或其他 map)。

首先,定义一个基本的结构体来表示你已知的部分 JSON 结构。对于未知的部分,可以使用 map[string]interface{}。例如:

type Response struct {
    KnownField string              `json:"known_field"`
    UnknownData map[string]interface{} `json:"unknown_data"`
}

func handler(c *gin.Context) {
    // 假设你从某处获取了原始的 JSON 数据
    rawData := `{
        "known_field": "value",
        "unknown_data": {
            "nested_field1": "nested_value1",
            "nested_field2": 123
        }
    }`

    var response Response
    if err := json.Unmarshal([]byte(rawData), &response); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, response)
}

在这个例子中,Response 结构体包含一个已知的字段 KnownField 和一个用于存储未知数据的 UnknownData 字段。使用 json.Unmarshal 将原始 JSON 数据解析到这个结构体中,Gin 会自动将 UnknownData 字段中的嵌套 JSON 转换为 map[string]interface{}

这种方法灵活性很高,适用于需要处理动态 JSON 结构的场景。

回到顶部