将struct转换为json数组而不是json对象

时间:2017-11-01 15:40:57

标签: json go

如果这个问题被认为太容易或者其他什么,我会事先道歉;这是我第一次写任何东西。我有两个结构(为这个问题简化)

type A struct {
    Content string
}

type B struct {
    Element A `json:"0"`
    Children []B `json:"1"`
}

我想将B类型的值编码为JSON,但不是返回一个对象,而是应该返回一个json数组

例如:

我得到了什么:

[
    {
        "0":{
            "Content":"AAA"
        },
        "1":[
            {
                "0":{
                    "Content":"BBB"
                },
                "1":[
                    {
                        "0":{
                            "Content":"CCC"
                        },
                        "1":[]
                    },
                    {
                        "0":{
                            "Content":"DDD"
                        },
                        "1":[]
                    }
                }
            ]
        ]
    }
]

我需要什么:

[
    {"Content": "AAA"}, 
    [
        [
            {"Content": "BBB"},
            [
                {"Content": "CCC"}, 
                []
            ]
        ], 
        [
            {"Content": "DDD"}, 
            []
        ]
    ]
]

我可以通过手动迭代来实现这一点,但我希望有一种综合的方法来实现它

2 个答案:

答案 0 :(得分:1)

您可以通过在B中实施json.Marshaler界面来实现。

例如:https://play.golang.org/p/fT1WlQ5Raz

package main

import (
    "encoding/json"
    "fmt"
)

type A struct {
    Content string
}

type B struct {
    Element  A
    Children []B
}

// MarshalJSON implements json.Marshaler
func (b B) MarshalJSON() ([]byte, error) {
    return json.Marshal([]interface{}{
        b.Element,
        b.Children,
    })
}

func main() {

    root := B{
        Element: A{Content: "AAA"},
        Children: []B{
            B{
                Element: A{Content: "BBB"},
                Children: []B{
                    B{Element: A{Content: "CCC"}, Children: []B{}},
                    B{Element: A{Content: "DDD"}, Children: []B{}},
                },
            },
        },
    }

    content, _ := json.MarshalIndent(root, "", "  ")
    fmt.Printf("%s\n", content)
}

结果:

[
  {
    "Content": "AAA"
  },
  [
    [
      {
        "Content": "BBB"
      },
      [
        [
          {
            "Content": "CCC"
          },
          []
        ],
        [
          {
            "Content": "DDD"
          },
          []
        ]
      ]
    ]
  ]
]

答案 1 :(得分:0)

我认为你需要一个界面来将AB结构包装到一个切片中

请在此处查看我的代码段https://play.golang.org/p/c0xldskKyz