为了账号安全,请及时绑定邮箱和手机立即绑定

解码 json 值的更好方法

解码 json 值的更好方法

Go
MMTTMM 2023-07-17 14:29:29
假设一个具有通用格式的 JSON 对象  "accounts": [    {      "id": "<ACCOUNT>",       "tags": []    }  ]}我可以创建一个带有相应 json 标签的结构来像这样解码它 type AccountProperties struct {    ID AccountID `json:"id"`    MT4AccountID int `json:"mt4AccountID,omitempty"`    Tags []string `json:"tags"`  }  type Accounts struct {    Accounts []AccountProperties `json:"accounts"`  }但最后一个只有一个元素的结构对我来说似乎不正确。有没有一种方法可以简单地说,type Accounts []AccountProperties `json:"accounts"`而不是创建一个全新的结构来解码这个对象?
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您需要某个地方来存储 json 字符串accounts。用一个:


var m map[string][]AccountProperties

就足够了,尽管您当然需要知道使用字符串文字accounts来访问由此创建的(单个)映射条目:


type AccountProperties struct {

    ID           string   `json:"id"`

    MT4AccountID int      `json:"mt4AccountID,omitempty"`

    Tags         []string `json:"tags"`

}


func main() {

    var m map[string][]AccountProperties

    err := json.Unmarshal([]byte(data), &m)

    fmt.Println(err, m["accounts"])

}

D(我必须更改to的类型string并修复{json 中缺失的内容)。

这并不比仅使用匿名结构类型短:

var a struct{ Accounts []AccountProperties }

就调用而言Unmarshall(这样完成后使用起来更方便。如果您想在调用中使用这样的匿名结构json.Marshall,则需要标记其单个元素以获得小写编码:如果没有标记,它将被调用"Accounts"而不是"accounts".

(我并不认为地图方法更好只是一种替代方法。)


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信