我有一个第三方 json api 可以在 go 中使用。
它有一些以键值形式返回数据的端点。
例如,这里是状态的 json:
{
"result": {
"0": "done",
"1": "incomplete",
"2": "completed",
....
}
}
正如您所看到的,它不是一个数组,而是一个对象。
是否可以将这种 json 编组为对象数组,例如
type Status struct {
Id int
Status string
}
不使用额外的结构,如
type StatusReposne struct {
Result map[string]string `json:"result"`
}
和提取值的代码?
正如 @mkopriva 在评论中所述,如果没有一些额外的工作,这是不可能的。此代码确实提供了将数据编组/解组数据到/从切片中编组/取消编组的方法Status
s:
func main() {
sr := new(StatusReposne)
json.Unmarshal([]byte(input), sr)
fmt.Printf("%+v\n", sr)
js, _ := json.Marshal(sr)
fmt.Printf("%s\n", js)
}
type StatusReposne struct {
Result []Status `json:"result"`
}
type Status struct {
Id int
Status string
}
func (x *StatusReposne) MarshalJSON() ([]byte, error) {
var buffer struct {
Result map[string]string `json:"result"`
}
buffer.Result = make(map[string]string)
for _, v := range x.Result {
buffer.Result[strconv.Itoa(v.Id)] = v.Status
}
return json.Marshal(&buffer)
}
func (x *StatusReposne) UnmarshalJSON(b []byte) error {
var buffer struct {
Result map[string]string `json:"result"`
}
buffer.Result = make(map[string]string)
json.Unmarshal(b, &buffer)
for k, v := range buffer.Result {
k, _ := strconv.Atoi(k)
x.Result = append(x.Result, Status{Id: k, Status: v})
}
return nil
}
var input = `{
"result": {
"0": "done",
"1": "incomplete",
"2": "completed"
}
}`
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)