easyjson 将数组解组为 go 结构

easyjson unmarshal array into go struct

我最近开始使用 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.

处理对象数组

顺便说一下,我知道这个问题与这个问题类似 但是用户使用内置 json 包而我 have/want 使用 easyjson. 提前谢谢你。

//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(但你必须做完全相同的事情以另一种方式操作它你想稍后编组它......)。