0

我有如下的 Json 数据

{
  "!type": "alarm",
  "$": {
    "12279": {
      "!type": "alarm",
      "title": "Default",
      "$": {
        "5955": {
          "!type": "alarm",
          "name": "Wake",
          "day": "SUN",
          "startTime": "06:00"
        },
        "29323": {
          "!type": "alarm",
          "name": "Away",
          "day": "SUN",
          "startTime": "08:00"
        },
        "2238": {
          "!type": "alarm",
          "name": "Home",
          "day": "SUN",
          "startTime": "18:00"
        }
      }
    }
  }
}

我的fbs是这样的

namespace space.alarm;

table Atom{
    !type:string;
    name:string;
    startDay:string;
    startTime:string; }

table AtomShell{
    key:string (required, key);
    value: Atom; }

table Alarm{
    !type:string;
    title:string;
    $:[AtomShell]; }


table AlarmShell{
    key:string (required, key);
    value:Alarm;  }


table Weeklyalarm{
    !type:string;
    $:[AlarmShell]; } root_type Weeklyalarm;

我试图实现谷歌平面缓冲区,但我遇到了类似的错误

  1. alarm.fbs:4:0: 错误:非法字符:!
  2. alarm.fbs:23:0: 错误:非法字符:$ (我已从 !type 中删除 ! 并将 $ 更改为美元以测试平面缓冲区的工作,但我无法更改动态 ID)
  3. Sample.json:25:0:错误:未知字段:12279

现在我的问题,

  1. 是否可以在平面缓冲区中使用动态 ID,如果可能,我应该如何进行?
  2. 可以在 ids 中使用特殊字符,如果可能的话怎么做?

提前致谢。

4

1 回答 1

0

字段名称中不能有!和之类的字符。$只需使用type代替!type等。

不确定动态ID是什么意思。所有字段名称(键)都必须在模式中声明,因此它们不能是动态的。但是,如果您使 JSON 看起来像这样,您仍然可以获得类似的结果:

{
  "type": "alarm",
  "data": [
    {
      id: "12279",
      "type": "alarm",
      "title": "Default",
      "data": [
        {
          "id": "5955",
          "type": "alarm",
          "name": "Wake",
          "day": "SUN",
          "startTime": "06:00"
        },
        {
          "id": "29323",
          "type": "alarm",
          "name": "Away",
          "day": "SUN",
          "startTime": "08:00"
        },
        {
          "id": "2238",
          "type": "alarm",
          "name": "Home",
          "day": "SUN",
          "startTime": "18:00"
        }
      ]
    }
  ]
}

然后制作相应的schema。

请注意,我将“动态”列表变成了一个向量,并将 id 移到了对象本身中。

其他提示:如果将非动态字符串值(如"alarm")改为枚举,则它们将占用更少的空间。

于 2016-11-07T21:13:59.600 回答