如何在Golang中迭代JSON数组?

15

我正在尝试解码一个JSON数组并将其放入结构体的切片中。我已经了解了如何做到这一点,但前提是JSON数组包含键。我的JSON数组没有包含键。

我已经将程序精简到只处理JSON数据的部分。它可以编译并在下面找到。

package main

// 2014-04-19

import (
    "fmt"
    "encoding/json"
)

type itemdata struct {
    data1 int // I have tried making these strings
    data2 int
    data3 int
}

func main() {
    datas := []itemdata{}

    json.Unmarshal([]byte(`[["7293","1434","99646"],["4657","1051","23795"]]`), &datas)
    // I have tried the JSON string without the qoutes around the numbers
    fmt.Println(len(datas)) // This prints '2'
    fmt.Println("This prints") // This does print 
    for i := range datas {
        fmt.Println(datas[i].data1)  // This prints '0', two times 
    }
    fmt.Println("And so does this") // This does print
}

我搜索过类似于“Go Lang无键JSON解码”之类的内容,并阅读了Go Lang网站上的文章(和“包页面”)。 我可以找到足够的有关如何使用Go和JSON的信息,但是我找到的所有文章都没有解释如何在JSON数组中不使用键。

如果我得到错误消息,我不会觉得奇怪; JSON值是stringy-number类型(这是我输入它们的方式),但我正在尝试将它们转换为整数。 但是我并没有收到错误消息。 我已经尝试使“itemdata”结构中的值为字符串,但这并没有帮助太多。 删除JSON值中的引号也没有帮助。

我想知道如何将我的JSON数组制作为“itemdata”的切片。 前三个值将分别放在“itemdata.data1”,“itemdata.data2”和“itemdata.data3”中。

如果您认为我可以改进我的问题,请告诉我。

提前感谢,
Remi

1个回答

9
您这里有一个二维字符串数组。您可以像这样解码它:
type itemdata [][]string

func main() {
   var datas itemdata

    json.Unmarshal([]byte(`[["7293","1434","99646"],["4657","1051","23795"]]`), &datas)
    fmt.Println(len(datas))
    fmt.Println("This prints")
    for i := range datas {
        fmt.Println(datas[i][1]) 
    }
    fmt.Println("And so does this")
}

Demonstration


1
谢谢你的帮助,那真是快!我可以通过循环把它们放入一个结构体片中,不是吗? - Remi
你可以像这样进行转换:http://play.golang.org/p/d-VrY58ovQ 这是你想要的吗? - Denys Séguret
那正是我在寻找的!谢谢。 抱歉没有立即将您的答案设置为“已解答”,我需要等待几分钟。 - Remi
3
@Remi 在 SO 上花时间消化和测试一个答案绝对没有问题。 - Denys Séguret

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接