有没有办法从http响应中提取JSON而不必构建结构?

15 json go

我所看到的所有方法都涉及构建结构并将数据解组到结构中.但是,如果我收到数百个字段的JSON响应怎么办?我不想创建100个字段结构只是为了能够获得我想要的数据.来自Java背景,有简单的方法可以简单地将http响应作为字符串获取,然后将JSON字符串传递给允许轻松遍历的JSON对象.这很痛苦.Go中有这样的东西吗?

伪代码中的Java示例:

String json = httpResponse.getBody();
JsonObject object = new JsonObject(json); 
object.get("desiredKey");
Run Code Online (Sandbox Code Playgroud)

Aru*_*n G 22

Golang:从HTTP响应中获取JSON而不使用结构作为帮助程序

这是我们遇到的典型情况.这是通过json.Unmarshal.

这是一个简单的json

{"textfield":"I'm a text.","num":1234,"list":[1,2,3]}
Run Code Online (Sandbox Code Playgroud)

它被序列化以通过网络发送并在Golang端解组.

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
    // replace this by fetching actual response body
    responseBody := `{"textfield":"I'm a text.","num":1234,"list":[1,2,3]}`
    var data map[string]interface{}
    err := json.Unmarshal([]byte(responseBody), &data)
    if err != nil {
        panic(err)
    }
    fmt.Println(data["list"])
    fmt.Println(data["textfield"])
}
Run Code Online (Sandbox Code Playgroud)

希望这有用.

  • 对于像我这样的新手:`data["list"]`,`data["textfield"]`,...是接口,因此您可以使用类型断言来获取具体类型。即`data["list"].([]interface{})[0]`将为1(这也是一个接口,其具体类型为`int`)。为什么是“[]接口{}”?因为 `json.Unmarshal` 将 JSON 数组存储到 []interface{} 中。查看 Unmarshal 的文档有很大帮助。 (3认同)

dap*_*lho 5

json.Unmarshal 方法将解组为不包含原始 JSON 对象中所有字段的结构。换句话说,你可以挑选你的领域。下面是一个示例,其中 FirstName 和 LastName 是精心挑选的,而 MiddleName 从 json 字符串中被忽略:

package main

import (
  "encoding/json"
  "fmt"
)

type Person struct {
  FirstName string `json:"first_name"`
  LastName  string `json:"last_name"`
}

func main() {
  jsonString := []byte("{\"first_name\": \"John\", \"last_name\": \"Doe\", \"middle_name\": \"Anderson\"}")

  var person Person
  if err := json.Unmarshal(jsonString, &person); err != nil {
    panic(err)
  }

  fmt.Println(person)
}
Run Code Online (Sandbox Code Playgroud)