解组没有元素名称的json

时间:2017-09-17 21:14:26

标签: go

我正在尝试读取一个json文件并在我的Go类中解析为jsonObject。 当我收到它时,json有一个随机的名字和元素数量。 例如:

{"707514313":1505680270,"1568212945":1505676950,"732898933":1505681884}

所以我看到的所有示例都使用结构来定义unmarshal的接口,在那里他们放置了json值的名称,但在我的情况下我不能这样做,因为我不知道有多少和json值的名称。

var settings struct {
    Name1  string `json:"707514313"`
    Name2  string `json:"1568212945"`
    Who knows how many more and with which names?!
}

所以我最终使用默认界面

进行解组
func loadFileToJson(filename string) {
    plan, _ := ioutil.ReadFile(filename)
    var data interface{}
    checkError(json.Unmarshal(plan, &data))
    fmt.Println("Data %s ", data)
}

数据加载(map[String]interface{})

知道如何实现我想要的目标。

编辑:

我创建了这个结构

type Structure struct {
    Name map[string]uint64
}

通过

更改旧的默认值
var jsonObject []Structure
checkError(json.Unmarshal(plan, &jsonObject))

给我这个错误

json: cannot unmarshal object into Go value of type []main.StructureData %s  []

2 个答案:

答案 0 :(得分:2)

正如@Anzel指出,您的数据似乎非常适合map[string]uint64。这假定了一些事情,即你的对象键总是字符串(如你的例子),并且值总是uint64(再次作为你的样本数据建议)。因此,解组为该数据类型而不是interface{}

plan := []byte(`{"707514313":1505680270,"1568212945":1505676950,"732898933":1505681884}`)
var data map[string]uint64
json.Unmarshal(plan, &data)
fmt.Printf("Data is %+v\n", data)

<强>输出

Data is map[1568212945:1505676950 732898933:1505681884 707514313:1505680270]

答案 1 :(得分:1)

如评论所示,您只需将字段类型设置为map[string]uint64并实现一些方法来解析文件并获取地图值。

在这个游乐场中查看一些伪代码: playground

但是,根据您的地图值,您可能需要将字段类型定义为map[string]uint64或反映json结构的任何内容,例如map[string]interface{}甚至是嵌套结构的嵌入式结构。

希望这有帮助。