2016-11-18 37 views
0

我有一個結構,像這樣:JSON:嵌套一個人口結構進入一個新的結構

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" 
} 

我該怎麼做?

回答

0

我想你可以靜態聲明另一個結構的使用方法:

type WrappedOutput struct { 
    fields my_struct 
    meta string 
} 

然後,你可以嵌入你的結構編組

o := WrappedOutput{fields: output}

全新之前去所以不知道這是否是最簡單的方法來做到這一點

0

乾淨的方式來做到這一點將是聲明2個結構(我已經做到了全局下面)和嵌套My_struct裏面的更高層次的結構。

然後你可以Mashalling前初始化更高層次結構:

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)) 

} 
+0

我在這裏的問題是,我不_always_需要big_struct,這是一個有條件的事情。有沒有辦法做到這一點? – jaxxstorm

+0

@Frap你不能初始化My_struct,特別是沒有聲明的新字段。 Go沒有像在Python中看到的那樣的面向對象繼承類型。然而,你可以聲明一個有條件的匿名結構,並且可以在它內部嵌套'My_struct'。我用第二個例子編輯了我的答案。 – nosequeldeebee

0

如果你不希望使用一個新的結構,你可以這樣做:

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

它不乾淨,但它的工作。