1

假设我有一个 Bond 结构,例如

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

当我使用 将此对象的实例序列化为 JSONSimpleJsonWriter时,我得到以下信息

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

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

但我会期待更多这样的事情:

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

wherephone_numbers是一个有两个成员的对象。

这是怎么回事?

4

1 回答 1

2

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

在这种特殊情况下,我们需要记住 Bond 允许使用其他基本类型(例如整数、双精度数、布尔值)的键进行映射。因此,Bond 对所有映射使用键+值对数组。

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

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

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

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

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

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

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

于 2016-04-12T21:12:45.733 回答