【问题标题】:Print/Log full unstructured json from stream in Go从 Go 中的流中打印/记录完整的非结构化 json
【发布时间】:2020-04-24 12:52:46
【问题描述】:

我继承了其他人的 API 代码,由于我不熟悉它收到的请求,我正在尝试打印它们或记录它们,以便查看它们的结构。根据我对 Go 的了解,json 是用 Structs 解码的,但由于我不知道如何接收请求,所以我无法编写结构。

我在基本 API 上尝试了以下操作,但他们只是打印出一张空地图或什么都没有:

func createBook(w http.ResponseWriter, r *http.Request) {
    var result map[string]interface{}
    _ = json.NewDecoder(r.Body).Decode(&result)
    fmt.Println(result)

func createBook(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    var book Book
    _ = json.NewDecoder(r.Body).Decode(&book)

    buf := new(bytes.Buffer)
    buf.ReadFrom(r.Body)
    newStr := buf.String()

    reader := strings.NewReader(newStr)
    writter := os.Stdout

    dec := json.NewDecoder(reader)
    enc := json.NewEncoder(writter)

    for {
        var m map[string]interface{}
        if err := dec.Decode(&m); err == io.EOF {
            break
        } else if err != nil {
            log.Fatal(err)
        }

        if err := enc.Encode(&m); err != nil {
            log.Println(err)
        }
        fmt.Println(m)
    }

    book.ID = strconv.Itoa(rand.Intn(100000000)) // Mock ID - not safe
    books = append(books, book)
    json.NewEncoder(w).Encode(book)
}

有没有其他方法可以在我事先不知道支撑的情况下打印接收到的 json?

【问题讨论】:

  • 它可能正在打印一个空地图,因为您的 JSON 输入可能是一个空对象。或者它可能是一个简单的值,如 JSON 数字或字符串,或 JSON 数组,而数组不能解组到映射中。或者您的输入 JSON 可能无效。请不要忽略返回的错误。此外,如果您不知道输入是对象还是数组,请使用interface{}encoding/json 包将选择可以解组为的适当类型——如果是 JSON 对象,则为[]interface{}
  • @icza 我在第一个示例中使用了接口,但仍然返回了一个空地图,除非你的意思是别的。也没有返回错误,我知道json是有效的,因为代码能够很好地处理它。

标签: json go


【解决方案1】:

使用 json.Unmarshal 函数

import "bytes"

 func createBook(w http.ResponseWriter, r *http.Request) {
    var result map[string]interface{}
     data :+ StreamToByte(r.Body)
    err := json.Unmarshal(data, &result)
    if err !=nil{
        fmt.Println(err) //better to use log 
    }else
        fmt.Println(result)
   }
}
 func StreamToByte(stream io.Reader) []byte {
  buf := new(bytes.Buffer)
    buf.ReadFrom(stream)
    return buf.Bytes()
}

参考: https://appdividend.com/2020/02/28/golang-how-to-convert-json-to-map-in-go/ https://gist.github.com/dixudx/3989284b142414e10352fde9def5c771

【讨论】:

  • 谢谢! StreamToByte 正是我需要能够使用 unmarshal 但我不知道如何使用。
猜你喜欢
  • 2020-02-19
  • 2019-04-02
  • 2019-12-12
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多