2017-11-01 9 views
0

構造体の型がJSON文字列で指定されている場合、JSON文字列を構造体に非整列化するにはどうすればよいですか。これは私のコードです:構造体への非JSONの呼び出し

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type ServiceResult struct { 
    Type string  `json:"type"` 
    Content interface{} `json:"content"` 
} 

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

func main() { 

    nikola := ServiceResult{} 
    nikola.Type = "Person" 
    nikola.Content = Person{"Nikola"} 

    js, _ := json.Marshal(nikola) 
    fmt.Println("Marshalled object: " + string(js)) 
} 

そして今、私は、このJSON文字列から新しい人を作成したいが、 タイプは、JSON文字列から読み出す必要があります。

{"type":"Person","content":{"name":"Nikola"}} 

答えて

-1

あなたはServiceResultからインスタンスを作成するときに、あまりにも、その後アンマーシャリングそれを人とコンテンツinitができます

service := ServiceResult{Content: Person{}} 
json.Unmarshal(data, &service) 
+0

質問によれば、アンマーシャリングの後、またはアンマーシャリング中までContentにどのタイプを使用するかはわかりません。 – Adrian

+0

質問では、この2つの構造体でこの型を非整列化する方法を尋ねるだけではなく、多くのパラメータのデータパスまたはクエリのparamまたは複雑なことを考えるいくつかの点からチェックすることもできます。 – Jeyem

+0

質問は非常に最初の文 "構造体の型はJSON文字列で与えられます"。 – Adrian

3

まず、あなたのタイプ

type ServiceResult struct { 
    Type string  `json:"type"` 
    Content interface{} `json:"content"` 
} 

のためにあなたがする必要があると思い メソッドを定義して「カスタムJSONマーシャラを実装する」メソッド:

にその型の値をアンマーシャルするとき、これはJSONデコーダ呼び出し、そのメソッドを行います -

func (sr *ServiceResult) UnmarshalJSON(b []byte) error 
はあなたのタイプは encoding/json.Unmarshalerインタフェースを満たすようにします。その方法では

、あなたはそれに最初にアンマーシャリングそのbスライスにヘルパータイプ

type typedObject struct { 
    Type string   `json:"type"` 
    Content json.RawMessage `json:"content"` 
} 

を使用することができます。

ワット/ oをエラーを生成完了アンマーシャリング場合、タイプtypedObjectのあなたの値 はTypeストリングタイプ を記述する文字列を持つことになり、生(未解析)JSON文字列は、その中で、「内容」欄に を含まContentフィールド。

あなたはその後、 はのように、それにContent フィールドにあるデータをすべて非整列化するために、実際の移動タイプを選択実行するswitch(またはマップ検索または何でも)を実行します。

var value interface{} 
switch sr.Type { 
case "person": 
    value = new(Person) 
case "car": 
    value = new(Car) 
} 
err = json.Unmarshal(sr.Content, value) 

...どこPersonおよびCarは、具体的な構造体タイプ です。消費するためには、encoding/jsonが適しています。

これらの概念を完全に理解するには、thisthis をお読みください。

関連する問題