在输入数据上有一个示例。
{ "status": "OK", "status_code": 100, "sms": { "79607891234": { "status": "ERROR", "status_code": 203, "status_text": "Нет текста сообщения" }, "79035671233": { "status": "ERROR", "status_code": 203, "status_text": "Нет текста сообщения" }, "79105432212": { "status": "ERROR", "status_code": 203, "status_text": "Нет текста сообщения" } }, "balance": 2676.18 } type SMSPhone struct { Status string `json:"status"` StatusCode int `json:"status_code"` SmsID string `json:"sms_id"` StatusText string `json:"status_text"` } type SMSSendJSON struct { Status string `json:"status"` StatusCode int `json:"status_code"` Sms []SMSPhone `json:"sms"` Balance float64 `json:"balance"` }
这是在向服务器发出适当请求后我收到的数据的示例。我得到了这样的数据。此类数据如何序列化?由于嵌套结构列表的动态名称,我的尝试失败了。如何正确处理此类嵌套的动态结构?
使用地图(类型为map[string]SMSPhone)sms在JSON中对对象进行建模:
map[string]SMSPhone
sms
type SMSPhone struct { Status string `json:"status"` StatusCode int `json:"status_code"` StatusText string `json:"status_text"` } type SMSSendJSON struct { Status string `json:"status"` StatusCode int `json:"status_code"` Sms map[string]SMSPhone `json:"sms"` Balance float64 `json:"balance"` }
然后拆封:
var result SMSSendJSON if err := json.Unmarshal([]byte(src), &result); err != nil { panic(err) } fmt.Printf("%+v", result)
将导致(在Go Playground上尝试):
{Status:OK StatusCode:100 Sms:map [79035671233:{Status:ERROR StatusCode:203 StatusText:Неттекстасообщения}} 79105432212:{Status:ERROR StatusCode:203 StatusText:Неттекстасообщения} 79607891234:{Status: StatusText:Неттекстасообщения}]余额:2676.18}
result.Sms地图中的键是对象的“动态”属性,即电话号码。
result.Sms