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

Remove object with given property from JSON using regex

本文关键字:属性 对象 删除 正则表达式 JSON      更新时间:2023-09-26

给定我有一个代表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",这意味着对象可以包含我需要的标志。之后可能还有其他属性。但这里最重要的是" flag哪个shouldiuse "道具,这意味着该对象应该被删除(但只有在值等于'true'的情况下)。结果我应该收到:

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

我对正则表达式的了解还不够多,请大家帮帮我。

注:请不要提及用regex解析JSON,这是疯狂'不正确'坏主意-确保我知道。

ANSWER:现在我有工作正则表达式做的东西。谢谢大家谁试图帮助这里。也许它会对某人有用。

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

regexp

仅使用正则表达式确实无法做到这一点。像这样的代码可能会起作用:

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*{/