在Javascript中使用JSON

时间:2018-01-05 20:46:29

标签: javascript json

考虑以下用例:

  • AV接收器向我发送状态消息:SURR0004
  • 我可以很容易地将其解码为状态:SURR,值:4
  • 在我的展示应用中,我想展示一个用户友好的字符串,例如" STEREO"
  • 在我的显示应用程序中,它使用通用命令,相当于接收方创建和接收值4的命令可能是ST。
  • 所以,我需要一个查找数组(存储在JSON文件中),它为SURR类别提供了变量映射数组。每个阵列应包括接收器代码(即4),通用命令(即ST)和显示文本(即" STEREO")。
  • 此阵列中可能只有50个元素!所以我需要一种方法来以最小的开销(文件大小和处理术语)来表达它们。

一种方法可能是JSON,如下所示。但是其中50个元素变得笨拙!还有6或7个其他类别,如SURR!

 "SURR": [
      {
        "deviceCode": "1",
        "stdCode": "STE",
        "display": "STEREO EXTENDED"
      },
      {
        "deviceCode": "4",
        "stdCode": "ST",
        "display": "STEREO"
      }]

另一种方法可能如下。虽然这样可以节省空间,但它也缺乏可读性,并且很容易搞砸了创作。

    "SURR": 
    [
        "mapValues": 
        [
            0,
            1,
            2,
            3,
            4,
            ...
        ],
        "commandValues": 
        [
            STE,
            DD,
            DTX,
            NIGHT,
            ST,
            ...
        ],
        "mapDisplayValues": 
        [
            "SOMETHING",
            "DOLBY DIGITAL",
            "ANALOG",
            "SOMETHING ELSE",
            "STEREO",
            ...
        ]
    ]

必须有另一种既易于阅读又能理解且有效的方法?

一个简单的数组?

[
  {"1", "STEX", "STEREO CYCLE"}
  {"9", "ST", "STEREO"}
]  

希望对组织数据的最佳方式及其原因有所了解!

2 个答案:

答案 0 :(得分:1)

为什么不将状态消息作为键的对象。

优点是复杂的结构,并且易于维护,因为所有信息都在对象中的相同位置。

{
    SURR0001: {
        deviceCode: "1",
        stdCode: "STE",
        display: "STEREO EXTENDED"
    },
    SURR0004: {
        deviceCode: "4",
        stdCode: "ST",
        display: "STEREO"
    }
}

答案 1 :(得分:1)

首先,你的袖手旁观的建议是无效的JSON:

[
  {"1", "STEX", "STEREO CYCLE"}
  {"9", "ST", "STEREO"}
]

JSON对象由名称/值对组成,而不仅仅是值。不过你可以把它们变成数组:

[
  ["1", "STEX", "STEREO CYCLE"]
  ["9", "ST", "STEREO"]
]

就您的其他问题而言,JSON很容易成为javascript应用程序可以轻松访问的最紧凑的格式。但是,如果您担心存储或传输限制,您始终可以将数据序列化为更简洁的文本格式,例如制表符或逗号分隔的文本,这些文本很容易在运行时编组为更有用的结构(并且您为此可以找到实体库)。如果您的示例数据具有代表性,那么可能会节省10%的尺寸。

现在大多数JS引擎都非常快:你可以在几毫秒内轻松迭代10k项目的数组。除非你是为某种动力不足的嵌入式设备编写的,否则它将没有任何区别。即使在这种情况下,也可以有效地自由访问几百个项目的数组。但是,如果您真的很担心,您可以随时使用哈希表而不是数组,以便直接访问而不必总是搜索:

{
  "1": { "code": "STEX", "dsp": "STEREO CYCLE" },
  "9": { "code": "ST",   "dps": "STEREO" }
}

直接访问显然消除了遍历整个集合的需要。但同样,除非你正在为一个极其动力不足的设备或JS引擎而建,否则这些都不会产生任何影响。

错误的结构化数据倾向于鼓励错误分解的业务逻辑和显示代码。我的建议是尽可能准确地选择反映数据域的数据结构,而不是从一开始就对性能约束进行过度索引。

  

真正的问题是程序员花了太多时间在错误的地方和错误的时间担心效率;过早优化是所有邪恶的根源 - 唐纳德克努特

如果您在创作时担心拼写错误,请在线查找工具,或者将其构建为纯文本,然后编写一次性转换脚本,或者只是在浏览器控制台中构建结构,然后将其导出。 / p>