使用正则表达式从 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 节点