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

Why is the JSON serialization of a Bond map an array instead of a dictionary?

假设我有一个像

这样的债券结构
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 是一个有两个成员的对象。

怎么回事?

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

在这种特殊情况下,我们需要记住 Bond 允许使用其他原始类型(例如整数、双精度、布尔值)的键进行映射。因此,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> 可以特殊情况下序列化为一个对象。此外,可以开发 encode/decode 将所有基元类型转换为成员名称的转换规则。

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

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