当前位置: > > > > 如何将 JSON 响应中的特定数组值转换为数组中的第一个值?
如何将 JSON 响应中的特定数组值转换为数组中的第一个值?
来源:stackoverflow
2024-04-30 10:45:36
0浏览
收藏
Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《如何将 JSON 响应中的特定数组值转换为数组中的第一个值?》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!
问题内容
(注意,此问题不需要 dgraph;它只是我遇到问题时使用的工具)
假设您有一些结构
type accountsettings struct {
uid string `json:"uid"`
dtype string `json:"dgraph.type"`
name string `json:"name"`
username string `json:"username"`
}
type settings struct {
uid string `json:"uid"`
dtype string `json:"dgraph.type"`
account accountsettings `json:"account"`
}
type tag struct {
uid string `json:"uid"`
dtype string `json:"dgraph.type"`
label label `json:"label"`
}
type user struct {
uid string `json:"uid"`
dtype string `json:"dgraph.type"`
settings settings `json:"settings"`
tags []tag `json:"tags"`
}
然后您创建一个用户并将其添加到您的 dgraph 数据库
user = user{
dtype: "user",
settings: settings{
dtype: "settings",
account: settingsaccount{
dtype: "settingsaccount",
name: "billy bob"
username: "billyboy123"
},
tags: []tag{{
dtype: "tag",
label: "admin"
}, {
dtype: "tag",
label: "user"
}}
},
}
然后你查询你的 dgraph 数据库(假设你有用户节点的 uid)
{
user(func: uid("0x1234")) {
uid
settings {
account {
name
username
}
}
tags {
label
}
}
}
响应将返回为
{
"data": {
"user": [
{
"uid": "0x1234"
"settings": [
{
"account": [
{
"name": "Billy Bob",
"username": "billyboy123"
}
]
}
]
"tags": [
{
label: "admin"
},
{
label: "user"
},
]
}
]
}
}
所以问题是 dgraph 的 json 响应将以数组形式返回结构类型的字段(大概是因为可能有多个节点指向单个其他节点),但由于它是一个数组,因此您无法立即编组它与 user 结构(因为 user.settings 的类型为 settings,而不是 []settings)。
为了使用 user 结构(或任何其他类型的结构)编组 dgraph json 响应,您会做什么?
需要注意的是,json 响应中的 settings 数组应该只是该数组中的第一个元素,但 tags 数组仍应保留为数组,因为这是 user 结构中指定的内容。
解决方案
您可以使用自定义 unmarshal 来执行此操作,如下所述:
您可以通过将原始 user 嵌入到一个匿名类型中来使用别名,该匿名类型内部有一个 settings 切片,您可以像这样进行 umarshal 操作:
func (u *User) UnmarshalJSON(data []byte) error {
type Alias User
aux := &struct {
Settings []*Settings `json:"settings"`
*Alias
}{
Alias: (*Alias)(u),
}
if err := json.Unmarshal(data, &aux); err != nil {
return err
}
u.Settings = aux.Settings[0]
return nil
}
这里有一个完整的工作示例(您需要对 accountsettings 使用相同的技巧):
终于介绍完啦!小伙伴们,这篇关于《如何将 JSON 响应中的特定数组值转换为数组中的第一个值?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~米云公众号也会发布Golang相关知识,快来关注吧!
