easyjson unmarshal массив в go struct

Недавно я начал работать с golang и easyjson. Теперь я должен разобрать массив json в структуру, чтобы работать с ним.
Итак, вот что я получил.

Входящие JSON-данные выглядят следующим образом

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

My struct:

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»-structs. Но писать что-то вроде

var items []Item

не будет работать также, потому что я не могу выполнить UnmarshalEasyJSON на срезе.
Я использую easyjson, потому что это способ fastet для обработки данных json.

Поэтому мой вопрос: как я могу обрабатывать массив объектов с помощью easyjson.

Кстати, я знаю, что этот вопрос похож на этот Unmarshal json в struct: нельзя unmarshal array в Go value, но там пользователь использует встроенный пакет json, и у меня есть/хотите использовать easyjson.
Заранее спасибо.

1 ответ

  1. Что о

    //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, прежде чем вернуть его (но вам придется сделать ту же самую операцию в другом порядке, который вы хотите маршалировать его позже…).