【问题标题】:How can I improve my JSON schema?如何改进我的 JSON 架构?
【发布时间】:2015-07-22 11:15:50
【问题描述】:

我这里有这个 JSON:

  [{
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ -2.449212707644754, 2.3458776596, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 1.449212707644754, 2.3458776596, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, 2.3458776596, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, 2.3458776596, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, 2.3458776596, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, 2.3458776596, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, 2.3458776596, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, 2.3458776596, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ -5.449212707644754, 2.3458776596, -1.452433 ]
  }]

表示图中的点列表。在这种情况下,给定时间戳有三个点,因此这个 JSON 描述了三个图(三个通道)。

这适用于普通通道(即简单的浮点值列表)。 到目前为止一切顺利。

不幸的是,在某些情况下,我们有所谓的“最小最大”通道,其中每个点都表示为一对浮点数!

让我们以最后一个例子为例,将中间通道(第二个)替换为“minmax”通道。这里的问题是我不知道如何对那个“minmax”通道的浮点数进行 JSON 化处理。

  [{
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ -2.449212707644754, ???, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 1.449212707644754, ???, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, ???, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, ???, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, ???, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, ???, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, ???, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ 0.449212707644754, ???, 1.452433 ]
  },
  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ -5.449212707644754, ???, -1.452433 ]
  }]

最好的方法是什么?我可以在其他数组中有未命名的数组吗? 那么在 Javascript 对象中反序列化这样的 JSON 呢?

【问题讨论】:

  • 我不知道如何对那个“minmax”通道的浮点数进行 JSON 化处理 为什么不使用嵌套数组?
  • 你能给我举个例子吗?一个正确的 SO 答案将不胜感激。
  • 确实可以在其他数组中包含数组。那应该没问题。我不知道 javascript 对象中的反序列化是如何工作的。请尝试插入浮点数组并更新结果:)
  • @hindmost JSON 格式将数组声明为值,因此我需要该内部数组的名称。我说的对吗?
  • 我需要一个内部数组的名称? 您很可能会将数组与对象混淆。对象应该具有命名属性。数组不应该。

标签: javascript json serialization json-deserialization


【解决方案1】:

您可以在这部分嵌套一个数组,如下所示:

没有极小值:

  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ [0.449212707644754], [1.11111], [1.452433] ]
  },

使用极小极大:

  {
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [ [0.449212707644754], [1.11111, 1.63245345], [1.452433] ]
  },

然后在解析时,您只需要检查第二个通道有多少数组元素,这样您就可以确定它是否是最小值。当然,它与通道一和通道三完全相同。

输入时,数组表示为左括号和右括号: []其中可能包含一个逗号分隔的值列表[“a”、“b”、“c”]。 这些值可以是任何 JSON 数据类型:字符串、数字、布尔值、 对象,数组,空。 来源:https://www.json.com/json-array

【讨论】:

  • 太棒了!但从我从 JSON 规范json.org 中可以看出,一个数组应该总是有一个名称(我的意思是,它应该被编码为一个名称、值对),我可能遗漏了一些东西。我告诉你,因为 JSON 字符串实际上是由 C# 序列化程序生成的,所以我需要找到一种方法来定义一个最终序列化为 JSON 的对象类。
  • 它当然有名字,ChannelsValues 现在是“array of arrays”类型。看看这里:数组类型可以是 array: json.com/json-array 类型。在 C# 部分我帮不了你,对不起
  • 好的,所以如果我序列化一个“C# 浮点数组数组”,我最终会得到这种 JSON?
  • 我猜是这样,但我无法明确回答这个问题。但它应该以这种方式工作。
【解决方案2】:

如果频道有一些含义,您还可以考虑将 firstsecondthird 名称替换为以下架构,以更好地描述频道。

{
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "Channels": {
        "first": {
            "value": -5.449212707644754
        },
        "second": {
            "min": 0.312,
            "max": 1.2312321
        },
        "third": {
            "value": -1.452433
        }
    }
}

该解决方案的优点是可读性更好。 minmax 的含义很明显。如果你使用嵌套数组,没有人会知道它是一个“minmax”通道

【讨论】:

  • 不错的解决方案。问题是我想让 JSON 的东西尽可能精简。我们要转移数千个点,所以我正在寻找一些不太可能的参数名称(“first”、“second”、“min”、“max”等)。
  • 如果您需要小文件,也许您应该考虑除 json 之外的其他格式?也许是二进制?无论是小尺寸还是可读性 - 你需要选择:)
  • @damgad:如果是极小极大通道,则有两个值,如果不是,则数组中有一个。确定是否是极小极大所需的程序逻辑非常少。
【解决方案3】:

将您的频道值设为对象数组。这样,您可以命名这些对象的属性,而不是依赖它们的位置来指示它们的含义。例如

{
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [
        { 
            value: -2.449212707644754
        },
        { 
            min: -2.449212707644754,
            max: 4.678432425151,
        },
        { 
            value: 1.452433
        }
    ]
}

关于 JSON 数据大小,大多数 Web 服务器将允许您启用 HTTP 响应压缩,并且浏览器会自动解压缩。这在服务器端非常容易启用。压缩的 JSON 与 Google Protocol Buffers 等二进制协议一样小。在这种情况下,JSON 中会有很多冗余,所以它应该可以很好地压缩。您也可以将属性名称设为单个字符。例如v 代表值,n 代表最小值,x 代表最大值。

{
    "HistoryId": "bf39d7cfca8536b3e00e5355dff25a97715bc439a5c73d41d10a9eb0c45f2e68",
    "DateTime": "2014-05-13T09:24:49",
    "ChannelsValues": [
        { 
            v: -2.449212707644754
        },
        { 
            n: -2.449212707644754,
            x: 4.678432425151,
        },
        { 
            v: 1.452433
        }
    ]
}

【讨论】:

  • 不错的解决方案。问题是我想让 JSON 的东西尽可能精简。我们要转移数千个点,所以我正在寻找一些不太可能的参数名称(“value”、“min”、“max”等)。
  • @G_G 大多数 Web 服务器都会让您启用 HTTP 响应的压缩,并且浏览器会自动解压缩。这在服务器端非常容易启用。压缩的 JSON 与 Google Protocol Buffers 等二进制协议一样小。在这种情况下,JSON 中会有很多冗余,所以它应该可以很好地压缩。
  • 您也可以将属性名称设为单个字符。例如v 代表值,n 代表最小值,x 代表最大值。
猜你喜欢
  • 2014-05-05
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 2016-11-03
  • 2017-02-21
相关资源
最近更新 更多