2016-11-09 32 views
3

私は2つのjson-marshallable匿名構造体を持っています。Golangでどのように2つの構造体をマージできますか?

a := struct { 
    Name string `json:"name"` 
}{"my name"} 

b := struct { 
    Description string `json:"description"` 
}{"my description"} 

そのような何かを得るためにJSONにそれらをマージする方法はあります:

{ 
    "name":"my name", 
    "description":"my description" 
} 
+0

を、 a.Name、b.Description) '?いくつかのこと**は**いくつかのコーディングを必要とします。 – Volker

答えて

5

それは少し複雑だが、私はあなたがこのような何かを行うことができたとします

a := struct { 
     Name string `json:"name"` 
    }{"my name"} 

    b := struct { 
     Description string `json:"description"` 
    }{"my description"} 

    var m map[string]string 

    ja, _ := json.Marshal(a) 
    json.Unmarshal(ja, &m) 
    jb, _ := json.Marshal(b) 
    json.Unmarshal(jb, &m) 

    jm, _ := json.Marshal(m) 
    fmt.Println(string(jm)) 
+0

これは完全に私が必要なものです!ありがとうございました! –

+0

回答を受け入れ可能とマークできますか?ありがとう –

8

あなたはembed both structs in anotherです。

type name struct { 
    Name string `json:"name"` 
} 

type description struct { 
    Description string `json:"description"` 
} 

type combined struct { 
    name 
    description 
} 

JSONパッケージは、一種の労働組合のように埋め込まれた構造体を扱いますが、これはかなり迅速に不格好得ることができます。

+0

構造体が匿名であるというニュアンスがあります。私はそれが名前であることを知らない。だから私は埋め込みを使用することはできません。 –

+1

@DmitryKapsamun:タイプを作成できませんか?なぜ構造体は匿名ですか? –

3

すべては、継承を超えた構成に関するものです。 「あなたは、あなたと同じようにそれらを初期化することができます

type name struct { 
    Name string `json:"name"` 
} 
type desc struct { 
    Description string `json:"description"` 
} 

:悲しいことに、あなたは匿名構造体を使用していますが、はっきりとそれらをマーシャリングJSONしようとしていることを考えるとしている、あなたはタイプとしてそれらを定義する方がよいでしょう現在行って再度、代わりstruct{<fields>}{init}、あなたはちょうどあなたが書面で好き

a := name{"foo"} 
b := desc{"Description"} 

あなたはその後、どのような方法でそれらを組み合わせることができ書きます:

c := struct { 
    name 
    description 
}{a, b} 

一つの癖(つまり、Yをトリップかもしれませんあなたが最初にメンバーを初期化する方法です)。あなたはこのようにそれを初期化することはできません

type foo struct { 
    name 
    description 
} 

:あなたは他の二つの構造体を組み合わせたタイプを作成することにしたと言う

o := foo{"Name value", "description value"} 

ゴーあなたがタイプnameようなタイプの文字列を使用して文句を言うでしょう。あなたはこのような何かを記述する必要があります:

o := foo{ 
    name{"Name value"}, 
    description{Description: "Description val"},//optional with field names 
} 

アンのインライン複合体は、既存のオブジェクト(CF c := struct{}{a, b})を使用して構築され、すでにこれを行います。あなたがやろうとしている内容に応じて、時々このような何かを書くことが容易である

func (s *MyCompositeType) CopyName(n name) { 
    s.Name = n.Name 
    //copy other fields 
} 

あなたはいくつかのレベルが深い複合型を入れ子にしているとき、それは人生が容易になります。

+0

jsonにマーシャリングすると、その文字列はどのように見えますか? – tutley

+0

@tutley:go playgroundで試してみてください。 '{" name ":" Name value "、" description ":" Description val "}'のようになります。他のタイプはエクスポートされていません。埋め込み構造体 –

+0

@tutley:確認済[ここ](https://play.golang.org/p/9VV0394hKC) –

0

次のような2つの構造体マージすることができます: `fmt.Sprintf( "{\" ":%qを、\" 説明\ ":%のQ名\}" と間違っているだろう何

package main 

import (
    "fmt" 
    "encoding/json" 
) 


type b struct { 
    Name string `json:"name"` 
    Description string 
    Url string 
} 

type a struct { 
    *b 
    MimeType string `json:"mimeType"` 
} 

func main() { 
    bc := b{"test", "testdecription", "testurl"} 
    ac := a{nil, "jpg"} 

    ac.b = &bc 

    js, _ := json.Marshal(ac) 

    fmt.Println(string(js)) 
} 
関連する問題