说我有像
这样的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
是一个有两个成员的对象。
发生了什么事?
答案 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协议的兼容性有限。