【问题标题】:Golang return nested JSON [closed]Golang 返回嵌套的 JSON [关闭]
【发布时间】:2015-04-30 08:19:07
【问题描述】:

我是 Go 新手,一直在尝试弄清楚如何输出原始的内部 JSON "{\"data\":\"Some data"}" 来自“外部”。到目前为止,没有运气......

这是输入数据:

{
 "Outer": "{\"data\":\"Some data\"}"
}

我想得到的是以下带有斜杠的字符串:

{\"data\":\"Some data\"}

【问题讨论】:

标签: json go


【解决方案1】:

如果你知道密钥(“Outer”),你可以这样做(on the Playground):

package main

import (
    "encoding/json"
    "fmt"   
)

func main() {
    //Creating the maps for JSON
    m := map[string]json.RawMessage{}

    //Parsing/Unmarshalling JSON encoding/json
    err := json.Unmarshal([]byte(input), &m)

    if err != nil {
        panic(err)
    }
    fmt.Printf("%s", m["Outer"])
}

const input = `
{
 "Outer": "{\"data\":\"Some data\"}"
}
`

请注意,您的示例 json 缺少数据后的最终转义。否则你会得到一个错误。

如果您不知道自己的结构,请参阅this reply,了解如何处理任意嵌套数据。

【讨论】:

  • 您的代码几乎正是我所需要的,但是,它返回的数据没有斜线。有没有办法让它保持与{\"data\":\"Some data\"} 完全一样的数据作为字符串返回?
  • 是的,2 个小改动就可以做到这一点。请参阅编辑后的答案。映射定义更改为使用json.RawMessagefmt.Printf 用于打印消息。
  • 太棒了!感谢您迄今为止的所有帮助!我还有一个问题要问你。我将如何将{\"data\":\"Some data\"} 也存储在变量中(包括斜杠)?
  • 使用返回字符串的fmt.Sprintf。您可以将结果分配给一个变量,它也将包含斜杠。
【解决方案2】:

这开始只是对previous answer 的评论,但后来增长了。

虽然你可以解组到一个临时的map[string]interface{}(或map[string]json.RawMessage),如果你只想忽略其他“外部”字段,它可以做很多额外的工作,它还需要检查之前的类型成立 (例如,对于像 {"Outer": 42} 这样的错误/意外输入的情况)。 这可能意味着在上一个答案中添加类似这样的内容:

    str, ok := m["Outer"].(string)
    if !ok { return errors.New("…") }
    err := json.Unmarshal([]byte(str), &actual)

更简单的可能是使用像这样的临时包装类型:

    var tmp struct{ Outer string }
    err := json.Unmarshal(b, &tmp)
    if err != nil { … }

    var data actualType
    err := json.Unmarshal([]byte(tmp.Outer), &data)

您可以在一个单独的函数中执行此操作,该函数返回您想要的类型(或错误,例如func foo(b []byte) (actualType, error))。 或者,您可以将其变体放入包装器类型上的自定义UnmarshalJSON 方法中,以便实现json.Unmarshaler。 如果您希望能够编组回相同的格式,也可以执行相反的操作。

操场上的完整可运行示例:https://play.golang.org/p/IXU2koyJ1A

【讨论】:

  • 注意,这回答了原始问题,而不是更改/编辑的问题。
  • 我非常感谢这些示例,这些示例在我将来需要分解和操作 JSON 时非常有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2012-11-13
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
相关资源
最近更新 更多