英文:
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处理对象数组。
顺便说一句,我知道这个问题与这个问题类似Unmarshal json into struct: cannot unmarshal array into Go value,但是那个用户使用的是内置的json包,而我有/想使用easyjson。
提前谢谢。
英文:
I started working with golang and easyjson recently. Now I have to unmarshal a json array into a struct to work with it.
So here's what I got.
The incoming JSON-data looks like this
[
{
"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
}
(I build the *_easyjson.go file)
And here's how I would use 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
}
That won't work, I know, because the json consists of an array of "Item"-structs. But writing something like
var items []Item
won't work either because I can't execute UnmarshalEasyJSON on a slice.
I'm using easyjson because it's the fastet way to handle json data.
So my question is: how can I handle the object array with easyjson.
By the way, I know this question is similar to this one Unmarshal json into struct: cannot unmarshal array into Go value but there the user uses the builtin json package and I have/want to use easyjson.
Thank you in advance.
答案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
(但是如果你以后想要进行编组操作,你将需要以相同的方式进行逆操作)。
英文:
What about
//easyjson:json
type ItemSlice []Item
?
Then, you can do
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
}
And if you really don't want an ItemSlice
in your outer code, you can still convert it back to []Item
before returning it (but you'll have to do the exact same operation in the other way it you want to marshal it later…).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论