easyjson unmarshal array into go struct

时间:2017-01-13 10:53:40

标签: json go marshalling unmarshalling

我最近开始使用golang和easyjson。现在我必须将一个json数组解组成一个结构来使用它。 所以这就是我得到的。

传入的JSON数据看起来像这样

[
    {
        "Item1":true,
        "Item2":"hello",
        "Item3":{
            "A": 1,
        },
    },
    ...
]

我的结构:

package something

//easyjson:json
type Item struct {
    Item1 bool
    Item2 string
    Item3 SubItem
}

//easyjson:json
type SubItem struct {
    A int      
}

(我构建* _easyjson.go文件)

以下是我将如何使用easyjson:

func ConvertJsonToItem(jsondata string) Item {
    var item Item
    lexer := jlexer.Lexer{Data: []byte(jsondata)}

    item.UnmarshalEasyJSON(&lexer)
    if lexer.Error() != nil {
        panic(lexer.Error())
    }
    return Item
}

这不起作用,我知道,因为json包含一系列“Item”结构。但是写一些像

这样的东西
var items []Item

将无法工作,因为我无法在切片上执行UnmarshalEasyJSON。 我正在使用easyjson,因为它是处理json数据的紧固方式。

所以我的问题是:如何使用easyjson处理对象数组。

顺便说一下,我知道这个问题类似于这个问题Unmarshal json into struct: cannot unmarshal array into Go value但是用户使用了内置的json包,我想/想要使用easyjson。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

怎么样?
//easyjson:json
type ItemSlice []Item

然后,你可以做

func ConvertJsonToItem(jsondata string) ItemSlice {
    var items ItemSlice
    lexer := jlexer.Lexer{Data: []byte(jsondata)}

    items.UnmarshalEasyJSON(&lexer)
    if lexer.Error() != nil {
        panic(lexer.Error())
    }
    return items
}

如果您真的不想在外部代码中使用ItemSlice,您仍然可以在返回之前将其转换回[]Item(但是您必须执行完全相同的操作另一种方式,你想在以后编组......)。