JSON:将填充的结构体嵌套到新结构中

时间:2016-11-18 18:01:28

标签: json go struct

我有一个像这样的结构:

type my_struct struct {
  First  string `json:"first"`
  Second string `json:"second"`
  Number int    `json:"number"`
}

当我将其编组为JSON时,它会输出非常简单的JSON,因为您需要:

var output_json []byte
output_json, _ = json.Marshal(output)
fmt.Println(string(output_json))

结果:

{"first":"my_string","second":"another_string","number":2}

到目前为止一切都很好!

在将该结构编组为JSON之前,我想做的是将其嵌套在另一个结构中。结果输出将是JSON,如下所示:

{
  "fields": {
    "first": "my_string",
    "number": 2,
    "second": "another_string"
  },
  "meta": "data"
}

我该怎么做?

3 个答案:

答案 0 :(得分:0)

我认为您可以静态声明要使用的另一个结构:

type WrappedOutput struct {
  fields my_struct
  meta string
}

然后你可以在编组之前嵌入你的结构

o := WrappedOutput{fields: output}

全新去,所以不确定这是否是最简单的方法

答案 1 :(得分:0)

执行此操作的干净方法是声明2个结构(我已在下面全局完成)并将My_struct嵌套在更高级别的结构中。

然后,您可以在编组它之前初始化更高级别的结构:

package main

import (
    "encoding/json"
    "fmt"
)

type My_struct struct {
    First  string `json:"first"`
    Second string `json:"second"`
    Number int    `json:"number"`
}

type Big_struct struct {
    Fields My_struct
    Meta   string
}

func main() {

    output := Big_struct{
        Fields: My_struct{
            First:  "my_string",
            Second: "another_string",
            Number: 2,
        },
        Meta: "data",
    }

    output_json, err := json.Marshal(output)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(string(output_json))

}

如果您不想要Big_struct,您可以根据需要在代码中声明匿名结构并将My_struct嵌套在其中:

package main

import (
        "encoding/json"
        "fmt"
)

type My_struct struct {
        First  string `json:"first"`
        Second string `json: "second"`
        Number int    `json:"number"`
}

func main() {

        output := struct {
                Fields My_struct
                Meta   string
        }{  
                Fields: My_struct{
                        First:  "my_string",
                        Second: "another_string",
                        Number: 2,
                },  
                Meta: "data",
        }   

        output_json, err := json.Marshal(output)
        if err != nil {
                fmt.Println(err)
        }   

        fmt.Println(string(output_json))

}

答案 2 :(得分:0)

如果您不想使用新结构,可以执行以下操作:

data := my_struct{First: "first", Second: "2", Number: 123}
result, _ := json.Marshal(&map[string]interface{}{"fields":data,"meta":"data"})
fmt.Println(string(result))

它不干净,但它可以完成工作。