【问题标题】:Unmarshal same json object with different key to go slice struct使用不同的键解组相同的 json 对象以进行切片结构
【发布时间】:2019-09-03 05:24:51
【问题描述】:

我不知道如何在不重写整个解析器的情况下使用不同的键序列化相同的 JSON 对象到 Go slice 结构。 例如,我可以接收回的 JSON,它可能包含 N 个具有不同键的数字对象(localhost1/localhost2/localhost3 等)。在这个例子中,我有一个key localhost1/localhost2/localhost3,每个只有一个字段ok。

{
"stats": {
        "localhost1": {
            "ok": 1
        },
        "localhost2": {
            "ok": 1
        },
        "localhost3": {
            "ok": 1
        }
     }
}

我可以使用以下 Structs 映射 Unmarsh 整个 JSON。

type HostStatus struct {
        Ok int `json:"ok"`
}

type Test struct {
    Stats struct {
        Localhost1 HostStatus `json:"localhost1"`
        Localhost2 HostStatus `json:"localhost2"`
        Localhost3 HostStatus `json:"localhost3"`
    }  `json:"stats"`
}

整个例子。

package main

import (
    "encoding/json"
    "fmt"
)
type HostStatus struct {
        Ok int `json:"ok"`
}

type Test struct {
    Stats struct {
        Localhost1 HostStatus `json:"localhost1"`
        Localhost2 HostStatus `json:"localhost2"`
        Localhost3 HostStatus `json:"localhost3"`
    }  `json:"stats"`
}


func main() {
    var resp = []byte(`{
        "stats": {
            "localhost1": {
            "ok": 1
        },
        "localhost2": {
            "ok": 1
        },
        "localhost3": {
            "ok": 1
        }
        }
    }`)

    var r Test
    er := json.Unmarshal(resp, &r)
    if er != nil {
        panic(er)
    } else {
        fmt.Println(r)
    }
}

此解决方案中的主要问题是,它需要在 Stats 结构中进行硬编码,每个 HostStatus 通过 json:xxx 标记将 1:1 映射到 JSON 输出。 但我想找到一种方法将所有这些对象映射到 HostStatus 切片/数组 因为我不知道我可能会收到多少 HostStatus 对象,以及每个对象的键是什么。

比如

type Test struct {
    Stats struct {
        LocalHostList []HostStatus `json:"localhost[0-9]"`
    }  `json:"stats"`
}

并使用类似 localhost[0-9] 的东西——即正则表达式语义,这将对 JSON 包产生影响。

【问题讨论】:

标签: json go


【解决方案1】:

试试这个:

type Test struct {
    Stats map[string]HostStatus `json:"stats"`
}

【讨论】:

  • 非常感谢。 !这正是我想要的。不知道 unmarshal() 足够聪明,无法将键映射到对象。非常好的解决方案
  • 如果我需要保留订单怎么办?
  • 如果您需要在 JSON 对象中保留键值对的顺序,您可以使用 json.Decoder 并自己解析它,或者使用可用的 JSON 库之一。我最近写了一个类似于 XML 的 DOM 模型的:github.com/bserdar/jsonom
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2015-01-19
相关资源
最近更新 更多