【问题标题】:Create struct for complex JSON array in Golang在 Golang 中为复杂的 JSON 数组创建结构
【发布时间】:2015-12-29 19:28:09
【问题描述】:

我有以下 JSON 数组,我正在尝试将其转换为结构。

[
    {
        "titel": "test 1",
        "event": "some value",
        "pair": "some value",
        "condition": [
            "or",
            [
                "contains",
                "url",
                "/"
            ]
        ],
        "actions": [
            [
                "option1",
                "12",
                "1"
            ],
            [
                "option2",
                "3",
                "1"
            ]
        ]
    }, {
        "titel": "test 2",
        "event": "some value",
        "pair": "some value",
        "condition": [
            "or",
            [
                "contains",
                "url",
                "/"
            ]
        ],
        "actions": [
            [
                "option1",
                "12",
                "1"
            ],
            [
                "option2",
                "3",
                "1"
            ]
        ]
    }
]

这是我目前得到的结构:

type Trigger struct {
    Event     string        `json:"event"`  
    Pair      string        `json:"pair"`   
    Actions   [][]string    `json:"actions"`
    Condition []interface{} `json:"condition"`
}

type Triggers struct {
    Collection []Trigger
}

但是,这并没有真正涵盖“条件”部分。理想情况下,id 也喜欢有一个结构。

【问题讨论】:

  • Condition 是一个数组,我认为使用 []interface{} 是最合理的方法。展开会很痛苦,但由于它们在数组中有 2 种类型,并且 Go 有严格的类型系统,除了你得到的或自己实现 UnmarshalJSON 以其他方式处理特殊情况之外,没有太多选择.

标签: json go


【解决方案1】:

假设根数组中的每个项目只能有一个条件,您可以尝试下面的结构。这可以使使用Condition 变得清晰。

https://play.golang.org/p/WxFhBjJmEN

type Trigger struct {
    Event     string     `json:"event"`
    Pair      string     `json:"pair"`
    Actions   [][]string `json:"actions"`
    Condition Condition  `json:"condition"`
}

type Condition []interface{}

func (c *Condition) Typ() string {
    return (*c)[0].(string)
}

func (c *Condition) Val() []string {
    xs := (*c)[1].([]interface{})
    ys := make([]string, len(xs))
    for i, x := range xs {
        ys[i] = x.(string)
    }
    return ys
}

type Triggers struct {
    Collection []Trigger
}

【讨论】:

  • 简直太棒了!这正是我需要的。非常感谢您抽出宝贵时间。
猜你喜欢
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多