英文:
golang, How to decode json array's items in simplejson?
问题
您好!根据您提供的代码和要求,以下是翻译好的内容:
传入的字符串是:
{"status_list":[
{"m_id":70,"m_status":"OK","m_status_code":200,"reported":false},
{"m_id":71,"m_status":"Send Message Over Time","m_status_code":800,"reported":false},
{"m_id":72,"m_status":"OK","m_status_code":200,"reported":false},
{"m_id":73,"m_status":"OK","m_status_code":200,"reported":false}
]}
我如何获取最后一个状态元素的 m_status
字段?
我目前使用的方法是:
import github.com/bitly/go-simplejson"
....
jsonRequest, _ := simplejson.NewJson([]byte(incommingString))
mArray := jsonRequest.Get("status_list").MustArray()
mItem := mArray[3]
fmt.printf("mItem: %")
m3StatusCode := mItem["m_status_code"] //<---<< 无法编译
我得到的错误信息是:
invalid operation: mItem["m_status_code"] (type interface {} does not support indexing)
如果我删除最后一行代码,我可以打印出 mItem
的内容:
mItem: : map[m_id:73 m_status:OK m_status_code:200 reported:%!s(bool=false)]
问题:
如何获取 m_status_code
的值?
英文:
incoming String is:
{"status_list":[
{"m_id":70,"m_status":"OK","m_status_code":200,"reported":false},
{"m_id":71,"m_status":"Send Message Over Time","m_status_code":800,"reported":false},
{"m_id":72,"m_status":"OK","m_status_code":200,"reported":false},
{"m_id":73,"m_status":"OK","m_status_code":200,"reported":false}
]
}
How can I get the m_status
field of the last status element?
The way I am using is
import github.com/bitly/go-simplejson"
....
jsonRequest, _ := simplejson.NewJson([]byte(incommingString))
mArray := jsonRequest.Get("status_list").MustArray()
mItem := mArray[3]
fmt.printf("mItem: %")
m3StatusCode := mItem["m_status_code"] //<---<< Can't compile
I got:
invalid operation: mItem["m_status_code"] (type interface {} does not support indexing)
If I remove last line code. I can print out mItem
as
mItem: : map[m_id:73 m_status:OK m_status_code:200 reported:%!s(bool=false)]
QUESTION:
How can I fetch m_status_code
value?
答案1
得分: 3
你需要先进行类型断言(type assertion)。
m, ok := mItem.(map[string]interface{})
if !ok {
fmt.Println("无效的数据")
}
fmt.Println(m["m_status_code"])
这是因为mItem
实际上不是一个map,而是一个interface{}
。simplejson的MustArray
方法返回一个[]interface{}
。
所以你需要断言mItem
中存储的值是你可以在m_status_code
上使用的类型。
英文:
You will have to do a type assertion first.
m, ok := mItem.(map[string]interface{})
if(!ok){
fmt.Println("Invalide data")
}
fmt.Println(m["m_status_code"])
This is because mItem
is not actually a map. Its an interface{}
. simplejson's MustArray returns a []interface{}
.
So you have to assert that the value stored in mItem
is of a type you can use an index m_status_code
on.
答案2
得分: 0
// 1. 转换为数组
array, err := json.Get("status_list").Array()
if err != nil {
panic(err)
}
// 2. 迭代
for _, item := range array {
// 3. 断言
if m, ok := item.(map[string]interface{}); ok {
fmt.Println(m["m_status_code"])
}
}
英文:
// 1. convert to array
array, err := json.Get("status_list").Array()
if err != nil {
panic(err)
}
// 2. iterate
for _, item := range array {
// 3. assertion
if m, ok := item.(map[string]interface{}); ok {
fmt.Println(m["m_status_code"])
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论