使用正则表达式从 JSON 中删除具有给定属性的对象

Posted

技术标签:

【中文标题】使用正则表达式从 JSON 中删除具有给定属性的对象【英文标题】:Remove object with given property from JSON using regex 【发布时间】:2017-03-30 20:16:18 【问题描述】:

假设我有一个代表 JSON 对象的字符串。它可能是无效,因为可能有一些参数将被另一个系统替换(例如 %param%)。我需要使用 regex 删除所有已知 propertyName 等于“true”的对象。


    "someTopLevelProp": "value",
    "arrayOfData": [
        
            "firstPropIAlwaysKnow": "value",
            "dontCareProp": $paramValue$,
            "dontCareProp2": 2,
            "flagWhichShouldIUse": true,
            "somethingAtTheEnd": "value"
        ,
        
            "absolutelyAnotherObject": %paramValue%
        ,
        
            "firstPropIAlwaysKnow": "value",
            "dontCareProp": "value",
            "dontCareProp2": 2,
            "flagWhichShouldIUse": false,
            "somethingAtTheEnd": "value"
        ,
        
            "firstPropIAlwaysKnow": "value",
            "dontCareProp": "value",
            "dontCareProp2": 2,
            "flagWhichShouldIUse": true,
            "somethingAtTheEnd": "value"
        
    ]

在上面的例子中,我总是有“firstPropIAlwaysKnow”,这意味着对象可以包含我需要的标志。之后可能还有其他属性。但这里最重要的是 "flagWhichShouldIUse" 属性,这意味着应该删除这个对象(但仅在值等于 'true' 的情况下)。结果我应该收到:


    "someTopLevelProp": "value",
    "arrayOfData": [
        
            "absolutelyAnotherObject": %paramValue%
        ,
        
            "firstPropIAlwaysKnow": "value",
            "dontCareProp": "value",
            "dontCareProp2": 2,
            "flagWhichShouldIUse": false,
            "somethingAtTheEnd": "value"
        
    ]

我的正则表达式知识不够强,因此请寻求社区的帮助。

附:请不要提及使用正则表达式解析 JSON 是疯狂\不正确\坏主意 - 请确保我知道。

回答:现在我有工作的正则表达式来做这些事情。感谢所有在这里尝试提供帮助的人。也许它会对某人有用。

/\s+?"firstPropIAlwaysKnow": "value"[^]+?(?:\[^]*\[^]+?)*[^]+?"flagWhichShouldIUse": true[^]+?,?/gi

Regexper

【问题讨论】:

怀疑这实际上是可能的,而无需编写自己的 JSON 解析器,该解析器知道会导致 JSON.parse 抛出的特定语法。最大的问题是嵌套。 可能无效的部分是否定义明确?我的意思是,例如,如果您知道任何类型的无效内容都来自 json 中的 %...% 表达式作为某个属性的值。 【参考方案1】:

你真的不能只用正则表达式来做到这一点。这样的事情可能会奏效:

let filtered = jsonstring
  // split into the individual 'objects'
  // might need to modify this depending on formatting. You
  // could use something like /,\s*/ to split the string,
  // but couldn't re-join with same formatting
  .split(',')
  // filter for only the strings with the relevant property
  // set to false
  .filter(s => s.match(/"flagWhichShouldIUse":\s*false/) // again, may need to change
   // put humpty-dumpty back together again
  .join(',');

确切的拆分方法在很大程度上取决于 JSON 的结构,这不是万无一失的。它不能正确处理嵌套。如果您的 JSON 打印得很漂亮,您可以使用制表符/空格字符的数量作为拆分器的一部分:例如,这只会拆分一个制表符:/\n\t,\s*/

【讨论】:

相当有趣的想法,而且可能更稳定。 @kirill.buga 是的,而且工作量也比编写自定义 json 解析器语法要少:) 我也在考虑对象开头\结尾的逗号。

以上是关于使用正则表达式从 JSON 中删除具有给定属性的对象的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从字符串中删除属性值不是特定值的所有 xml 节点

pyspark:删除作为另一列值的子字符串,并从给定列的值中包含正则表达式字符

从 JSON 数据中删除注释

从正则表达式模式中删除一些单词/字符串

删除正则表达式中的 Html 标签 [重复]

字符串函数(正则表达式?)从 url 字符串中删除查询字符串对