golang,如何在simplejson中解码json数组的项目?

时间:2016-03-31 05:32:10

标签: json go 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"]   //<---<< Can't compile

我得到了:

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值?

2 个答案:

答案 0 :(得分:2)

您必须先type assertion

m, ok := mItem.(map[string]interface{})
if(!ok){
    fmt.Println("Invalide data")
}

fmt.Println(m["m_status_code"])

这是因为mItem实际上不是地图。它是interface{}。 simplejson的MustArray返回[]interface{}

因此,您必须断言存储在{​​{1}}中的值属于可以使用索引mItem的类型。

答案 1 :(得分:0)

// 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"])
    }
}