代码之家  ›  专栏  ›  技术社区  ›  user6631314

修复无效的JSON

  •  0
  • user6631314  · 技术社区  · 5 年前

    我和一家很大的公司合作。json文件,是一长串大括号对,每个大括号代表一本书中的一行。这里有两对这样的。它们只是一次又一次地继续:

      {"index":{"_index":"tolstoy","_id":27}}
        {"type":"line","line_id":100,"book":"War and Peace","speech_number":1,"speaker":"Sonya","text_entry":"Weep. It will do you good"}
      {"index":{"_index":"tolstoy","_id":28}}
        {"type":"line","line_id":101,"book":"War and Peace","speech_number":1,"speaker":"Sonya","text_entry":"I will call Pyotr."}
    

    从我第一次看到的 _id 是项目的id。它从0到200000,对应于JSON文件中的总行数。反过来 line_id 是特定作品中的线条。 Speech number 是一个角色的演讲。

    这不是有效的json(根据json lint)。我有实际的文件,所以可以修改它的任何方式,我想。

    我会想象它应该是一个线对象数组,所以我应该把整个东西放在方括号里。我认为应该在条目之间加逗号。然而,当我这样做时,它仍然是无效的。我可以通过在索引行和类型行之间加一个逗号来使其有效,但这在直觉上是没有意义的。

    我如何修改上面的内容,使之成为可以在api中使用的格式良好的JSON。

    谢谢你的建议。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Chris Schaller    5 年前

    当前格式的数据可以称为 交错的 ,即有多种不同类型的记录,但它们之间的唯一关系是它们在文件中的位置。这种结构提供了一个用JSON表示的有趣挑战,JSON是一种 对象 符号aslos被称为a 图表 分层数据的分类。

    当将这些数据转换为JSON时,我们应该考虑结构将添加到最终消费者的价值,在使数据更容易解析和消耗时总是有一些价值,即使您不出售数据源,也可以降低成本,如果稍后需要回答有关数据的较少问题。

    集合中的两种记录类型是:

    1. 指数
    2. 文本输入

    因为这些记录之间存在1:1的关系,所以在JSON输出中将其中一条记录嵌套在另一条记录中没有任何价值。两条记录之间也没有共享/公共字段,两条记录之间也没有链接字段。这意味着每条记录都相互依赖。

    从消费者的角度来看,索引本身是没有意义的,索引的设计通常是为了方便快速搜索或引用记录。

    因为这里的任务是逐行处理数据 我们已经发现,生成嵌套结构没有什么价值 没有公共字段,这个交错的数据集可以很容易地合并或删除 扁平的 变成一个简单的单记录数组

    在分析了数据之后,我们也许能够找出解决问题的方法 正常化 它可以被转换成对象图,但需要重新处理整个文件,而且对用户的整体好处是值得怀疑的。如果数据是平面的,而不是嵌套的结构,通常更容易被更广泛的工具使用。

    为了平展这些数据,我们从 指数 记录,并将其注入 文本输入 ,在本例中,我还展平了索引结构,它本身就是一个嵌套对象:

    [
      {"index":"tolstoy","_id":27, "type":"line","line_id":100,"book":"War and Peace","speech_number":1,"speaker":"Sonya","text_entry":"Weep. It will do you good"},
      {"index":"tolstoy","_id":28, "type":"line","line_id":101,"book":"War and Peace","speech_number":1,"speaker":"Sonya","text_entry":"I will call Pyotr."}
    ]
    

    在json2table中可以看到这一点。通用域名格式: json2table representation

    实现这一目标的步骤:

    1. 在文件前面加一个新行以开始数组: [

    2. 去除 {"_index": 在全球范围内使用simple是安全的 查找并替换

    3. 加入 指数 文本输入 通过替换以下内容进行记录,包括用逗号换行:

      }}
        {
      

      如果您使用的是visual studio,这可以通过简单的查找并替换为正则表达式来实现,以下只是一个示例来说明要替换的内容:

      • 在应用之前的转换之后

      replace line break to join the records

    4. 现在用数组close字符附加整个文件: ]

    5. 在每行末尾加上 } 用逗号

    4.和5。可以反转,从自动化的角度来看,我发现这是一种更容易确保最后一行的方法 没有逗号

    需要考虑的事项:

    在平展索引之后,我还建议更改 _id index_id 读完这篇文章后,我很惊讶第一次就错过了。

    总的来说,这个文件中字段的名称是直观的,但是如果文件本身很大(如果这是一个问题…),那么,然后,通过减少其他字段的名称,例如 text_entry text , speech_number speechId / speechNo / speechNum ,

    在减少数据集成的名称时,应尽量避免将列减少为不明确的术语,如 line_id lid 语音电话号码 sid 因为这会对消费者施加更多的假设,这意味着你需要花更多的时间记录或回答问题。

    在优化数据馈送时,您需要在理论上可以实现的内容和实际可用资源之间找到平衡 消费者。

    • 由于不同的原因,每种情况都会有所不同。

    在当前示例中,如果文件中的每个记录对某个字段都有相同的值,则可以完全删除该字段 type 有可能属于这一类。

    如果需要考虑跨线路的字节,并且您希望坚持使用JSON,那么可以选择将数据规范化为嵌套对象图,您应该使用某种映射或翻译服务来实现这一点,或者编写代码,我不会手动尝试,但它可能看起来像是按以下顺序嵌套的数组:

    • 索引(作者)
        • 演讲
          • 文本条目

    如果你要把它处理成一个标准化的结构,它可能看起来像这样:

    json graph example

    对于一个大文件(删除了空格),虽然仍然可以通过表达式语法轻松定位图中的节点,但可能会产生显著的差异,重要的是没有丢失任何信息。