2017-08-07 9 views
-2

JSONで作業するすべての例では、JSONシンプルタイプまたはユーザータイプ(構造体など)にシリアライズする方法が説明されています。JSONの動的構造にシリアル化

しかし私は別のケースがあります:a)私のタイプ/オブジェクトのフィールドを知らない。b)すべてのオブジェクトが異なるタイプを持つ。私は、フィールド名とフィールド値を取得し、私のデータベース内の各エンティティの

while `select * from item` do 
    while `select fieldname, fieldvalue from fields where fields.itemid = item.id` do 
    ... 

はここで擬似コードで私の場合です。その結果、私はこのようなものを得る必要があります:

{ 
    "item.field1": value, 
    ... 
    "item.fieldN": value, 
    "custom_fields": { 
    "fields.field1": value, 
     ... 
    "fields.fieldK": value 
    } 
} 

Goでこれを行う最良の方法は何ですか?標準ライブラリに有用なライブラリや関数はありますか?

更新:データソースはデータベースです。結果では、JSONを外部のWebサービスにPOSTするための文字列としてJSONを取得する必要があります。したがって、プログラムはデータベースからデータを読み込み、POST要求をRESTサービスに送信するだけです。

+0

カスタムマーシャラでこれを実現できると思います。私はGoにデフォルトでこれを組み込む能力がないと思うので、あなた自身のロジックを書く必要があります。 'encoding/json'パッケージはあなたの構造体にカスタムマーシャルを許可します。見てください[ここ](https://golang.org/pkg/encoding/json/#example__customMarshalJSON)。 – Lansana

+1

[https://stackoverflow.com/questions/40559250/golang-dynamic-creating-member-of-struct/40568896](https://stackoverflow.com/questions/40559250/golang-dynamic-creating)をご覧ください。 -member-of-struct/40568896#40568896)。この例はUnmarshalですが、アイデアは同じです。すなわち、オブジェクトを 'map [string] interface {}'に保存し、 'json.Marshal'を使用してオブジェクトをJSONにシリアル化します。 – putu

答えて

1

あなたのターゲットタイプは何であるはずですか?あらかじめフィールドを知らないので構造体にすることはできません。

試着のみのタイプ私にタイプmap[string]interface{}mapのようだ:それにネストされた構造を実現することができます。

a := map[string]interface{}{ 
    "item.field1": "val1", 
    "item.field2": "val2", 
    "item.fieldN": "valN", 
    "custom_fields": map[string]interface{}{ 
     "fields.field1": "cval1", 
     "fields.field2": "cval2", 
    }, 
} 
b, err := json.Marshal(a) 

は遊び場サンプルhereを参照してください。

データベースからこの構造体を入力するのは、おそらくカスタムスクリプト(jsonを使用しない)です。

注:custom_fieldsは、値の列がデータベースにどのようなタイプであるかに応じて、他のタイプのものでもかまいません。値の列が文字列の場合は、map[string]stringを使用します。

+0

>>あなたのターゲットタイプは何であるはずですか?私はタイプが必要ない。外部WebサービスにPOSTするためにjsonが文字列として必要です。ありがとう。 – demas

+0

あなたは常にタイプを持っていて、それが 'interface {}'ならばあなたは常にタイプを持っています。あなたはこのことについてはっきりしていません。あなたのターゲットは文字列のようですが、あなたのソースは何ですか? – TehSphinX

+0

ソースはデータベースです。私はデータベースからデータを読んで、POSTリクエストをRESTサーバーに送る必要があります。 – demas

関連する問題