【问题标题】:json unmarshalling without struct没有结构的json解组
【发布时间】:2017-10-01 21:20:00
【问题描述】:

我已经关注 json

[{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/b;version=1493756861347"},{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/a;version=1493756856398"}]

基于给定的answer,我尝试关注

var objmap map[string]*json.RawMessage
err := json.Unmarshal(data, &objmap)

我得到空数组并出现以下错误。有什么建议吗?

json: 无法将数组解组为 map[string]*json.RawMessage 类型的 Go 值

【问题讨论】:

    标签: json go


    【解决方案1】:

    您可以解组到[]map[string]interface{},如下所示:

    var objmap map[string]interface{}
    if err := json.Unmarshal(data, &objmap); err != nil {
        log.Fatal(err)
    }
    fmt.Println(objmap[0]["href"]) // to parse out your value
    

    要了解有关解组工作原理的更多信息,请参见此处:https://godoc.org/encoding/json#Unmarshal

    【讨论】:

      【解决方案2】:

      这不是直接的答案,但我认为很有用

      没有结构的 Json Unmarshal & Indent

      
      func JsonIndent (jsontext []byte) ([]byte,error) {
          var err error
          var jsonIndent []byte
          var objmap map[string]*json.RawMessage
          err = json.Unmarshal(jsontext, &objmap)
          if err != nil {
              return jsonIndent,err
          }
          jsonIndent, err = json.MarshalIndent(objmap,"", "  ")
          return jsonIndent,err
      }
      

      【讨论】:

        【解决方案3】:

        您的 json 是一个 数组 对象,在 Go 中 encoding/json 包 marshals/unmarshals maps 到/从 json object 而不是数组,因此您可能希望分配一个 slice of maps

        var objs []map[string]*json.RawMessage
        if err := json.Unmarshal([]byte(data), &objs); err != nil {
            panic(err)
        }
        

        https://play.golang.org/p/3lieuNkoUU

        如果您不想使用切片,您可以随时将 json 数组包装在一个对象中。

        var dataobj = `{"arr":` + data + `}`
        var objmap map[string]*json.RawMessage
        if err := json.Unmarshal([]byte(dataobj), &objmap); err != nil {
            panic(err)
        }
        

        https://play.golang.org/p/XM8MmV0gbc

        【讨论】:

        • 感谢您的澄清,我还需要更多帮助,如果您还可以在解组后打印对象。
        • 您的意思是打印json.RawMessage 对象?如果是这样,json.RawMessage 只是一片字节,所以你可以这样打印它,例如play.golang.org/p/jeCU6PIWYv。但我想知道,你真的要使用json.RawMessage吗?其目的是允许您延迟 json 的解码(或预计算编码)...如果您不需要这两个功能,则最好使用具体类型。
        • 如果你不需要 @user2727195 的预计算/延迟的东西,你应该改用这样的东西:play.golang.org/p/VKf7HgAAID
        猜你喜欢
        • 2022-12-10
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 2013-03-05
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        相关资源
        最近更新 更多