如何解组具有不同类型值的json数组

Posted

技术标签:

【中文标题】如何解组具有不同类型值的json数组【英文标题】:How to unmarshal a json array with different type of value in it 【发布时间】:2014-08-15 12:45:44 【问题描述】:

例如:

["NewYork",123]

对于json数组被解码为go数组,而go数组需要显式定义一个类型, 不知道怎么处理。

【问题讨论】:

【参考方案1】:

首先,json 是无效的,对象必须有键,所以它应该是 "key":["NewYork",123] 或只是 ["NewYork",123]

当您处理多种随机类型时,您只需使用interface

const j = `"NYC": ["NewYork",123]`

type UntypedJson map[string][]interface

func main() 
    ut := UntypedJson
    fmt.Println(json.Unmarshal([]byte(j), &ut))
    fmt.Printf("%#v", ut)

playground

【讨论】:

【参考方案2】:

json 包使用 map[string]interface 和 []interface 值来存储任意 JSON 对象和数组... http://blog.golang.org/json-and-go

对象中的每个值都必须有键。所以假设这是你的 json :

"key":["NewYork",123]

那么你的代码应该是这样的:

package main

import (
    "encoding/json"
    "fmt"
)

type Message map[string]interface

func main() 
    msg := Message
    s := `"key":["Newyork",123]`
    err := json.Unmarshal([]byte(s), &msg)
    fmt.Println(msg, err)

你可以运行它:http://play.golang.org/p/yihj6BZHBY

【讨论】:

对于特定情况map[string][]interface 更好,因为他总是期待一个数组。 我刚刚关注了这里:blog.golang.org/json-and-go。但是,对于这种情况,您提供的内容也是明智的。 map[string]interface 如果您希望该值是 null 或数组之外的其他值,则非常好。

以上是关于如何解组具有不同类型值的json数组的主要内容,如果未能解决你的问题,请参考以下文章

在数组Vue Js中的另一个不同json对象中具有相同值的数组中的所有json对象中添加/合并新项目

如何解析具有相同键的不同数据类型的改造对象的json数组

解组数组并没有给我任何值

如何在 Go 中将 JSON 对象数组转换为具有默认值的结构数组?

将 json 数组解组为 go struct(数组在 JSON 字符串的中间

如何正确解组不同类型的数组?