从 JSON 中提取元素

Extracting Elements from JSON

我有一个函数returns JSON,return类型是这样的:

map[string]interface{}

在我的特殊情况下,我知道 returned JSON 看起来像这样:

{
  "someNumber": 1,
  "someString": "ee",
  "someArray": [
    "stringInArray",
    {
      "anotherNumber": 100,
      "anotherString": "asdf",
      "yetAnotherString": "qwer"
    }
  ]
}

我想获得 "stringInArray" 和 "anotherString" 的值。例如,我从 Go by Example and blog.golang.org 搜索了解决方案,但没有成功。

例如,假设 res 是函数调用的 json returned,我尝试了这个(来自 go 博客):

var f interface{}
b := []byte(`res` )
err2 := json.Unmarshal(b, &f)
if err2!=nil{
    log.Fatalf("Err unmarshalling: %v", err2)
}

m := f.( map[string]interface{} )

for k, v := range m {
    switch vv := v.(type) {
    case string:
        fmt.Println(k, "is string", vv)
    case int:
        fmt.Println(k, "is int", vv)
    case []interface{}:
        fmt.Println(k, "is an array:")
        for i, u := range vv {
            fmt.Println(i, u)
        }
    default:
        fmt.Println(k, "is of a type I don't know how to handle")
    }
}

(我知道上面的内容不会完全符合我的要求,但这是一个开始。) 但是当代码执行命中 b := []byte(res ) 时,我得到这个错误:

Err unmarshalling: invalid character 'r' looking for beginning of value

获取值的最有效方法/最佳实践是什么?我对任何解决方案持开放态度,不一定是上述方法。

@sydnash 这是我在回复您的评论时承诺的代码:

type LoginResponse2 struct {

    id float64
    jsonrpc string
    result struct {
        token string
        details struct {
            a float64
            b string
            c float64
        }
    }   
}

var resStruct2 LoginResponse2
// Convert result to json
b, _ :=json.Marshal(res)
fmt.Println( string(b) )
// results of Println:
{"id":1,"jsonrpc":"2.0","result":[ "myToken",{"a":someNumber,"b":"some string","c":someOtherNumber} ] }


// Unmarshall json into struct
err2 := json.Unmarshal(b, &resStruct2)
if err2 != nil {
    log.Fatalf("Error unmarshalling json: %v", err)
}

fmt.Println("Here is json unmarshalled into a struct")
fmt.Println( resStruct2 )
// results of Println
{0  { {0  0}}}

在 golang 包 encoding/json 的文档中有一个如何解组 json 的示例。本质上你的问题是 un-marshal 希望将 json 放入 type。因此,您的代码必须声明一个类型,该类型代表您正在转换的 json

json 示例和链接示例中声明的类型:

var jsonBlob = []byte(`[
    {"Name": "Platypus", "Order": "Monotremata"},
    {"Name": "Quoll",    "Order": "Dasyuromorphia"}
]`)
type Animal struct {
    Name  string
    Order string
}

一旦你定义了类型,它应该就位了。

我认为你应该使用 b := []byte(res) 而不是 b :=[]byte[res] 并且 res 应该是 json 字符串或 []byte。 res 不是合法的 json 格式。

此信息可能对您有所帮助: 要将 JSON 解组为接口值,Unmarshal 在接口值中存储以下之一:

bool,对于 JSON 布尔值

float64,对于 JSON 个数字

字符串,对于 JSON 个字符串

[]接口{},用于JSON数组

地图[string]接口{},用于JSON个对象

nil 对于 JSON null

你可以看到 JSON 个数字没有 int 而是 float64。