V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
JustSong
V2EX  ›  Go 编程语言

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

  •  
  •   JustSong ·
    songquanpeng · 2020-05-09 09:35:18 +08:00 · 2503 次点击
    这是一个创建于 1688 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    11 条回复    2020-05-09 12:27:08 +08:00
    insert000
        1
    insert000  
       2020-05-09 09:36:45 +08:00   ❤️ 1
    用 map
    pubby
        2
    pubby  
       2020-05-09 09:45:24 +08:00 via Android   ❤️ 1
    data json.RawMessage
    kaifang
        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)
    JustSong
        4
    JustSong  
    OP
       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
        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),
    })
    ```
    ClarkAbe
        6
    ClarkAbe  
       2020-05-09 10:39:29 +08:00 via iPhone   ❤️ 1
    先把你的 data.Data 序列化成 map 然后再....
    eslizn
        7
    eslizn  
       2020-05-09 10:44:55 +08:00   ❤️ 1
    data 用 interface{} 针对不同的内容设计不同的结构体,用 map 真的不合适
    lewinlan
        8
    lewinlan  
       2020-05-09 11:16:09 +08:00 via Android   ❤️ 1
    data.Data 已经是字符串了,你就用 c.string 返回啊,加个返回头。为啥还要反序列化??
    labulaka521
        9
    labulaka521  
       2020-05-09 11:53:45 +08:00 via Android   ❤️ 1
    同意楼上,直接构造个 json 字符串返回就好了,不用转来转去
    huayumo
        10
    huayumo  
       2020-05-09 12:07:02 +08:00   ❤️ 1
    对,就是楼上说的那样
    jituixiong
        11
    jituixiong  
       2020-05-09 12:27:08 +08:00 via Android   ❤️ 1
    楼上正解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:50 · PVG 21:50 · LAX 05:50 · JFK 08:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.