2016-04-12 11 views
1

は私がBondマップのJSONシリアル化が辞書の代わりに配列になっているのはなぜですか?

struct Person 
{ 
    0: string name; 
    1: map<string, string> phone_numbers; 
} 

のようなボンド構造体を持っていると言う、私はSimpleJsonWriterを使用してJSONにこのオブジェクトのインスタンスをシリアル化するとき、私はphone_numbersは、文字列の配列であることを、次の

{"name":"Jenny","phone_numbers":["home","867-5309","office","555-1212"]} 

お知らせを得ます。

しかし、私は期待する。このようなもっと何か:phone_numbers 2人のメンバーを持つオブジェクトである

{"name":"Jenny","phone_numbers":{"home":"867-5309","office":"555-1212"}} 

何が起こっているのですか?

答えて

2

ボンドのシンプルなJSONプロトコルは有効なJSONを使用しますが、必ずしも最も慣用的なJSONというわけではありません。 BondのSimple JSONプロトコルを解析する最も良い方法は、Bond自体を使用することです。

この場合、Bondは他のプリミティブ型のキー(たとえば、整数、倍精度、bool)でマップを使用できることを覚えておく必要があります。そのため、Bondはすべてのマップに一連のキー+値ペアを使用します。例えば

map<int32, string>

"numbers":[1,"unu",2,"du",3,"tri"] 

C#はgbcは非常に単純であるC#のために生成したオブジェクトとしてシリアル化されます。 Newtonsoft's Json.NET libraryは、問題なく、より慣用的なJSONにシリアル化することがよくあります。 Bondはこのライブラリを使用してJSONサポートの一部を実装しています。したがって、もっと慣用的なJSON出力が必要な場合は、これも新しい依存関係にはなりません。

C++の場合、慣用的なJSON出力が必要な場合は、JSONシリアライズライブラリを使用するカスタムトランスフォームを記述することができます。

おそらく、map<string, string>は、オブジェクトにシリアル化するために特別なケースが考えられます。また、すべてのプリミティブ型をメンバ名にエンコード/デコードするための変換ルールを開発することもできます。

しかし、既存のシンプルなJSONプロトコルを変更すると、既存のシリアライズされたデータが破損してしまいます。シリアライズされたデータは、シリアライゼーションライブラリでは必要ありません。 :-)

このような変更は、Simple JSONの新しいバージョンか、既存のSimple JSONプロトコルとの互換性が制限された新しいJSONシリアル化プロトコルとして追加する必要があります。

関連する問題