无需使用结构体进行JSON解组。

huangapple go评论105阅读模式
英文:

json unmarshalling without struct

问题

我已经翻译好了,以下是翻译的内容:

我有以下的 JSON 数据:

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

根据给定的答案,我尝试了以下代码:

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

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

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

英文:

I've following json

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

Based on the given answer I've tried following

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

I'm getting empty array with following error. any suggestions?

> json: cannot unmarshal array into Go value of type map[string]*json.RawMessage

答案1

得分: 19

你可以按照以下方式将其反序列化为[]map[string]interface{}

data := []byte(`[{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/b;version=1493756861347"},{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/a;version=1493756856398"}]`)
var objmap []map[string]interface{}
if err := json.Unmarshal(data, &objmap); err != nil {
    log.Fatal(err)
}
fmt.Println(objmap[0]["href"]) // 解析出你的值

要了解更多有关反序列化的工作原理请参阅此处https://godoc.org/encoding/json#Unmarshal
英文:

You can unmarshall to a []map[string]interface{} as follows:

data := []byte(`[{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/b;version=1493756861347"},{"href":"/publication/192a7f47-84c1-445e-a615-ff82d92e2eaa/article/a;version=1493756856398"}]`)
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

To see more on how unmarshalling works see here: https://godoc.org/encoding/json#Unmarshal

答案2

得分: 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
}
英文:

This is not direct answer but I think very useful

Json Unmarshal & Indent without struct
<pre><code>
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
}
</code></pre>

答案3

得分: 1

你的json是一个对象数组,在Go语言中,encoding/json包将map与json对象进行编组/解组,而不是数组,所以你可能想要分配一个map的切片

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

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

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

Your json is an array of objects, in Go the encoding/json package marshals/unmarshals maps to/from a json object and not an array, so you might want to allocate a slice of maps instead.

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

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

If you don't want to use a slice you can always wrap your json array in an object.

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

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

huangapple
  • 本文由 发表于 2017年5月4日 05:25:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/43770273.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定