dongwen3093
2016-07-21 06:14
浏览 103
已采纳

将JSON字符串中的JS数组解析为Golang映射

An API I query returns a JSON where one of the elements should be an array but is wrapped in quotation marks. It seems therefore the "encoding/json" package doesn´t recognize that element as an array.

When I try to make that element accessible as a map I get the error:

interface conversion: interface is string, not []interface {}

Playground: https://play.golang.org/p/K1H01q-Dqc

package main

import (
    "fmt"
    "encoding/json"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}

var incomingJson string = `{
    "status":"success",
    "content":"[{\"id\":\"567670128\"},{\"id\":\"567670129\"}]"
    }`

func main() {

    // Decode incoming json
    var encodedJson map[string]interface{}
    err := json.Unmarshal([]byte(incomingJson), &encodedJson)
    check(err)
    fmt.Println(encodedJson)

    // Accessing "content" data
    contentOjects := encodedJson["content"].([]interface{})
    contentObject0 := contentOjects[0].(map[string]string)
    fmt.Println(contentObject0)
} 

How should I convert/cast the string in ["content"] so I can parse it into map[string]string?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • douao1854 2016-07-21 06:58
    已采纳

    The value of "content" is a JSON string which by the way is another JSON encoded text. So if this is what you get, you may unmarshal the value of "content" just like you unmarshal any other JSON text:

    var contentOjects []interface{}
    err = json.Unmarshal([]byte(encodedJson["content"].(string)), &contentOjects)
    check(err)
    contentObject0 := contentOjects[0].(map[string]interface{})
    fmt.Println(contentObject0)
    

    Output:

    map[id:567670128]
    

    Alternatively you may unmarshal right into a value of type []map[string]interface{} (or even []map[string]string if you know it only contains string values):

    // Accessing "content" data
    var contentOjects2 []map[string]interface{}
    err = json.Unmarshal([]byte(encodedJson["content"].(string)), &contentOjects2)
    check(err)
    fmt.Println(contentOjects2[0])
    

    Output is the same:

    map[id:567670128]
    

    Try these on the Go Playground.

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题