将 JSON 文档展平为单行

Posted

技术标签:

【中文标题】将 JSON 文档展平为单行【英文标题】:Flatten JSON document to single line 【发布时间】:2019-12-13 11:06:15 【问题描述】:

上下文: 我正在集成的 API 以漂亮的打印形式吐出数据,如下所示。我有一个 MSSQL 解析过程,它要求输入 JSON 在单行中有一个平面形式(已删除标签)。

问题: 我发现了一些半相关的问题here 和here,但它们似乎不能满足我的需求,因为我不想在文件级别执行操作。

谁能推荐一些特定的方法来以更精细的方式将 JSON 文本转换为单行?也许是正则表达式或一些字符串操作方法?

当前 JSON 格式:


  "data": 
    "first_name": "Eric",
    "last_name": "B",
    "email": null,
    "score": null,
    "domain": "@datashiftlabs.io",
    "position": null,
    "twitter": null,
    "linkedin_url": null,
    "phone_number": null,
    "company": null,
    "sources": []
  ,
  "meta": 
    "params": 
      "first_name": "Eric",
      "last_name": "B",
      "full_name": null,
      "domain": "@datashiftlabs.io",
      "company": null
    
  

所需形式:

"data": "first_name": "Eric","last_name": "B","email": null,"score": null,"domain": "datashiftlabs.io","position": null,"twitter": null,"linkedin_url": null,"phone_number": null,"company": null,"sources": [],"meta": "params": "first_name": "Eric","last_name": "B","full_name": null,"domain": "datashiftlabs.io","company": null

【问题讨论】:

为什么不能完整的文件工作?从您的示例看来,它正在展平整个输入文件。 同样,MSSQL proc 依赖于特定的结构,并且添加的选项卡会导致所需的结构不正确并阻止解析正确执行。 抱歉,我误解了“我不想在文件级别执行预成型操作”的说法,这意味着您只想对文件中的一部分行进行操作。 :// 您的“MSSQL proc”似乎是垃圾。不符合文件标准的工具可能会出现其他问题。精心制作的恶意数据可能允许将诸如二级注入数据库之类的事情。换句话说:你的问题是那个工具,而不是 JSON。 【参考方案1】:

我不确定这是否真的是您想要的,但您可以将带有 json 库的 json 字符串转换为对象,然后再将其转换回字符串。

示例如下所示

import json

json_str = """
  "data": 
    "first_name": "Eric",
    "last_name": "B",
    "email": null,
    "score": null,
    "domain": "@datashiftlabs.io",
    "position": null,
    "twitter": null,
    "linkedin_url": null,
    "phone_number": null,
    "company": null,
    "sources": []
  ,
  "meta": 
    "params": 
      "first_name": "Eric",
      "last_name": "B",
      "full_name": null,
      "domain": "@datashiftlabs.io",
      "company": null
    
  
"""

obj = json.loads(json_str)
flatten_str = json.dumps(obj)

print(flatten_str)

另一种方法是使用字符串替换和正则表达式替换来删除所有不必要的字符,如换行符、多个空格和制表符。此功能的快速草稿如下所示。 注意:当前的正则表达式不能完美运行,并且在某些边缘情况下仍有一些意外行为,例如字符串末尾有多个空格

import re

def flatten_json(string):
    # Remove line breaks
    string = string.replace("\n", "")
    # Remove tabs and multiple spaces
    string = re.sub('[\t ]+("||)', r' \1', string)
    # Return result
    return string

【讨论】:

第一种方法是可靠的。第二个比我预期的要好,但并不完美;考虑[<spaces>[<spaces>"hello"<spaces>]<spaces>]——我有一些多空间区域幸存下来。不确定是否有其他情况我还没有发现。 另外(仅在第二种方法中),在某些情况下,当引用的字符串还包含大括号作为文字值以及相邻的空格时,空格会折叠在引用的字符串中。 @CharlesDuffy 你是绝对正确的,第二个选项可能会通过删除字符串中的重要空格或保留多余的空格来犯一些错误,这就是我说的原因,它只是一个快速草稿。正则表达式需要改进很多才能真正完美运行。 点头。我建议明确指出语义变化的风险。 @CharlesDuffy 我为当前正则表达式可能存在的问题添加了一个快速免责声明

以上是关于将 JSON 文档展平为单行的主要内容,如果未能解决你的问题,请参考以下文章

R:JSON 到 data.frame 的通用展平

通过按键过滤数组,使用 jq 展平 JSON 文档

使用 spark 展平嵌套的 json 文档并加载到 Elasticsearch

使用 pyspark,如何将文件中单行的多个 JSON 文档读入数据框?

展平 XML 文档

SQL - 如何将按类别分组的指标值展平为单行?