2016-11-16 541 views
3

鉴于我有一个表示JSON对象的字符串。它可能是无效,因为可能有一些参数将被另一个系统替换(例如%参数%)。我需要使用正则表达式删除已知propertyName等于“true”的所有对象。使用正则表达式从JSON中移除给定属性的对象

{ 
    "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”,这意味着对象可以包含标志,该标志我需要。之后,可能会有其他属性。但这里最重要的是“这个标志应该使用”道具,这意味着这个对象应该被删除(但只有当值等于'真'时)。因此,我应该收到:

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

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

P.S.请不要提及用正则表达式解析JSON它是疯狂的\不正确的\坏主意 - 确定我知道这一点。

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

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

Regexper

+0

怀疑这实际上可能无需编写自己的JSON解析器它意识到会导致'JSON.parse'抛出的特定语法。最大的问题是嵌套。 –

+0

可能无效的部件是否定义良好?例如,如果你知道任何一种无效的东西来自json内的'%...%'表达式作为一些属性的值。 –

回答

3

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

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

+0

非常有趣的想法,可能更稳定。 –

+0

@ kirill.buga是的,也比编写自定义json解析器语法的工作要少:) –

+0

我也在考虑对象开始\结束时的逗号。 –

相关问题