为什么Bond映射的JSON序列化是一个数组而不是一个字典?

时间:2016-04-12 21:12:46

标签: json bond

说我有像

这样的Bond结构
struct Person
{
    0: string name;
    1: map<string, string> phone_numbers;
}

当我使用SimpleJsonWriter将此对象的实例序列化为JSON时,我得到以下内容

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

请注意phone_numbers是一个字符串数组。

但我希望更像这样的事情:

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

其中phone_numbers是一个有两个成员的对象。

发生了什么事?

1 个答案:

答案 0 :(得分:2)

Bond的Simple JSON协议使用有效的JSON,但它并不总是最惯用的JSON。解析Bond的Simple JSON协议的最佳方法是使用Bond本身。

在这种特殊情况下,我们需要记住Bond允许使用其他原始类型的键(例如整数,双精度,bool)进行映射。因此,Bond为所有地图使用了一组键+值对。

例如,map<int32, string>被序列化为

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

gbc为C#生成的C#对象非常简单。 Newtonsoft's Json.NET library通常可以将它们序列化为更加惯用的JSON而不会出现任何问题。 Bond使用这个库来实现它的一些JSON支持,所以如果你需要更多惯用的JSON输出,这对你来说也不是新的依赖。

对于C ++,如果需要惯用的JSON输出,可以编写自定义转换以使用您选择的JSON序列化库。

可以想象,map<string, string>可以是特殊的,可以序列化为一个对象。此外,可以开发将所有基元类型编码/解码为成员名称的转换规则。

但是,对现有Simple JSON协议的这种更改会破坏现有的序列化数据,这不是您希望从序列化库中获得的数据。 : - )

需要在新版本的Simple JSON中添加这样的更改,或者作为新的JSON序列化协议添加,可能与现有的Simple JSON协议的兼容性有限。