【问题标题】:Handling two forms of JSON?处理两种形式的 JSON?
【发布时间】:2017-06-21 03:20:00
【问题描述】:

我正在用 Go 编写一个应用程序,它将接收两种形式的 JSON:

示例 1:

{"book_data":{"title":"book-title","page_number":457}}

示例 2:

{"book_data":{"collection":214},"books":{"data":[{"title":"book-title","page_number":457},{"title":"book-title","page_number":354}]}}

我认为我可以创建一个类似以下的结构并将 JSON 解组到其中:

type Book struct {
    Title      string `json:"title"`
    PageNumber int    `json:"page_number"`
}

但这仅适用于第一个示例。

如何处理这两个示例中的 JSON?

【问题讨论】:

标签: json go


【解决方案1】:

您可以先在json.RawMessage 中解组部分内容,然后再决定取决于解组的有效负载。你也可以在更通用的结构中解组。类似的东西

type Book struct {
    Title      string `json:"title"`
    PageNumber int    `json:"page_number"`
}
type BookShelf struct {
    BookData struct {
        Book
        Collection int `json:"collection"`
    } `json:"book_data"`
    Books struct {
        Data []Book `json:"data"`
    } `json:"books"`
}

对我来说,它看起来可读、有意义且足够方便,可以进行进一步处理。

【讨论】:

    【解决方案2】:

    为什么不解组到 map[string]interface{},然后使用结果来查看您需要处理哪种形式?然后,您可以为每个表单使用特定的结构类型进行反序列化。

    另一种方法是使用以下包来检查不同的属性,因此您可以决定使用哪个结构进行真正的解组。

    https://github.com/go-xmlpath/xmlpath/tree/v2

    【讨论】:

      【解决方案3】:

      您可以解组映射,因为您的键是字符串,而值可能类似于 - map[string]interface{}。如果您不确定任何数据类型或值,请使用 interface{} 因为它可以存储任何值。然后用result看看是什么形式,反序列化到具体的struct类型。

      另一种将 JSON 转换为 go struct 的方法是使用此工具。 https://mholt.github.io/json-to-go/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多