json 的键重复问题

2018-11-12 16:17:59 +08:00
 katsusan

最近在写个 steam 的第三方 api,其中有个接口是返回当前联赛中的比赛详细资料。url 是下面这个:

https://api.steampowered.com/IDOTA2Match_570/GetLiveLeagueGames/v1?key=<apikey>

但它返回的 json 里英雄描述技能升级的 key 是重复的,这个应该是不符合 json 编码标准的吧(没想到浓眉大眼的沃尔沃也干了),例如下:

"abilities":[  // <-这样的"abilities"键总共有 5 个(代表 5 个英雄的技能升级情况)
{
"ability_id":5106,   //唯一技能 ID
"ability_level":2  //技能等级
},
{
"ability_id":5107,
"ability_level":3
}
]
,
"abilities":[
{
"ability_id":5082,
"ability_level":3
},
{
"ability_id":5083,
"ability_level":2
}
]
,
"abilities":[
{
"ability_id":5122,
"ability_level":3
},
{
"ability_id":5123,
"ability_level":2
},
{
"ability_id":5125,
"ability_level":1
}
]

我尝试在结构体里用相同的 json tag 指定不同的字段但自带的 json 包好像解析不出来,求知道的大佬指点下。

	Abilities1 []struct {
		AbilityID    uint16 `json:"ability_id"`
		AbilityLevel uint8  `json:"ability_level"`
	} `json:"abilities"`
	Abilities2 []struct {
		AbilityID    uint16 `json:"ability_id"`
		AbilityLevel uint8  `json:"ability_level"`
	} `json:"abilities"`
5525 次点击
所在节点    Go 编程语言
28 条回复
ccpp132
2018-11-12 18:27:24 +08:00
看看你用的 json 库有没有 sax 的接口,这种一般可行
xqin
2018-11-12 18:46:04 +08:00
@katsusan 你在 github 上发的那个数据, 并没有你说的这种情况.
xqin
2018-11-12 18:53:10 +08:00
@katsusan 不好意思, 看错了, 是我的那个 Chrome 插件解析之后,只剩 4 个了, 查看 原始的数据的时候, 里面是有很多个.
vishva
2018-11-12 19:01:13 +08:00
拿到 json 之后先别解析,将五个"abilities"字符串依次替换成"abilities0","abilities1"...再解析
mengzhuo
2018-11-12 19:25:20 +08:00
有个东西叫

json-to-go
https://mholt.github.io/json-to-go/

type AutoGenerated struct {
Abilities []struct {
AbilityID int `json:"ability_id"`
AbilityLevel int `json:"ability_level"`
} `json:"abilities"`
}
gamexg
2018-11-12 21:47:48 +08:00
https://github.com/buger/jsonparser

这种库可以处理这个问题。
katsusan
2018-11-12 21:53:45 +08:00
@mengzhuo 谢谢,这个工具不错,但刚才试了这种写法还是只会解析最后一组 abilities 数据。
reus
2018-11-15 10:39:37 +08:00
这个不难处理,用标准库就行,稍微加点技巧

https://gist.github.com/reusee/2cf9de7bbf46e6049a798630002db54b

就是用 json.Decoder.Token 方法把 "abilities" 读掉,然后用 Decode 方法解码后面的数组,直到 Token 返回 '}'

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/507056

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX