douxiegan6468 2015-12-29 19:28
浏览 223
已采纳

在Golang中为复杂的JSON数组创建结构

I have the following JSON array that I'm trying to convert to a struct.

[
    {
        "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"
            ]
        ]
    }
]

This is the struct I've got so far:

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

type Triggers struct {
    Collection []Trigger
}

However, this does not really cover the "Condition" part. Ideally id like to have a structure for that as well.

  • 写回答

1条回答 默认 最新

  • dtlzdofl66441 2015-12-29 21:45
    关注

    Assuming that there can be only a single condition per item in the root array, you can try a struct below. This could make using Condition clear.

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题