我想看看是否有可能查找个人keys一出JSON字符串中的Javascript并返回它Value用Regex。有点像构建JSON搜索工具。
keys
JSON
Value
Regex
想象以下JSON
"{ "Name": "Humpty", "Age": "18", "Siblings" : ["Dracula", "Snow White", "Merlin"], "Posts": [ { "Title": "How I fell", "Comments": [ { "User":"Fairy God Mother", "Comment": "Ha, can't say I didn't see it coming" } ] } ] }"
我希望能够搜索JSON字符串并仅提取单个属性。
让我们假设它function已经是一个,看起来就像。
function
function getPropFromJSON(prop, JSONString){ // Obviously this regex will only match Keys that have // String Values. var exp = new RegExp("\""+prop+"\"\:[^\,\}]*"); return JSONString.match(exp)[0].replace("\""+prop+"\":",""); }
这将返回的子串Value的Key。
Key
例如
getPropFromJSON("Comments") > "[ { "User":"Fairy God Mother", "Comment": "Ha, can't say I didn't see it coming" } ]"
如果您想知道为什么为什么要代替使用它JSON.parse(),我正在建立一个JSON文档存储localStorage。localStorage仅支持键/值对,因此我JSON将整个字符串存储Document在unique中Key。我希望能够在文档上运行查询,理想情况下无需JSON.parsing()整个Collection过程的开销,Documents然后遍历Keys/ nested Keys来查找匹配项。
JSON.parse()
localStorage
Document
JSON.parsing()
Collection
Documents
Keys
我不是最擅长的,regex所以我不知道该怎么做,或者regex独自一人是否有可能。这只是一个实验,以找出是否可能。任何其他想法作为解决方案将不胜感激。
regex
我强烈建议您不要这样做。JSON不是此处明确指出的常规语言:https : //cstheory.stackexchange.com/questions/3987/is- json-a-regular-language
引用以上文章:
例如,考虑一个由数组组成的数组: [ [ [ 1, 2], [2, 3] ] , [ [ 3, 4], [ 4, 5] ] ] 显然,您无法使用真正的正则表达式进行解析。
例如,考虑一个由数组组成的数组:
[ [ [ 1, 2], [2, 3] ] , [ [ 3, 4], [ 4, 5] ] ]
显然,您无法使用真正的正则表达式进行解析。
我建议将JSON转换为对象(JSON.parse),并实现find函数遍历该结构。
除此之外,您还可以查看Douglas Crockford的json2.js解析方法的内容。也许经过更改的版本将允许您搜索JSON字符串并仅返回您要查找的特定对象,而无需将整个结构转换为对象。仅当您从不从JSON检索任何其他数据时才有用。如果这样做的话,您可能也已经将整个事情从一开始就进行了转换。
编辑
为了进一步展示正则表达式是如何分解的,下面是一个正则表达式,它试图解析JSON
如果将其插入http://regexpal.com/,并选中“全部匹配”。您会发现它可以很好地匹配某些元素,例如:
正则表达式 "Comments"[ :]+((?=\[)\[[^]]*\]|(?=\{)\{[^\}]*\}|\"[^"]*\") JSON匹配 "Comments": [ { "User":"Fairy God Mother", "Comment": "Ha, can't say I didn't see it coming" } ] 正则表达式 "Name"[ :]+((?=\[)\[[^]]*\]|(?=\{)\{[^\}]*\}|\"[^"]*\") JSON匹配 "Name": "Humpty"
正则表达式
"Comments"[ :]+((?=\[)\[[^]]*\]|(?=\{)\{[^\}]*\}|\"[^"]*\")
JSON匹配
"Comments": [ { "User":"Fairy God Mother", "Comment": "Ha, can't say I didn't see it coming" } ]
"Name"[ :]+((?=\[)\[[^]]*\]|(?=\{)\{[^\}]*\}|\"[^"]*\")
"Name": "Humpty"
但是,一旦您开始查询具有嵌套数组的高级结构(例如“帖子”),就会发现您无法正确返回该结构,因为正则表达式没有上下文,其中“]”是指定的结尾结构体。
正则表达式 "Posts"[ :]+((?=\[)\[[^]]*\]|(?=\{)\{[^\}]*\}|\"[^"]*\") JSON匹配 "Posts": [ { "Title": "How I fell", "Comments": [ { "User":"Fairy God Mother", "Comment": "Ha, can't say I didn't see it coming" } ]
"Posts"[ :]+((?=\[)\[[^]]*\]|(?=\{)\{[^\}]*\}|\"[^"]*\")
"Posts": [ { "Title": "How I fell", "Comments": [ { "User":"Fairy God Mother", "Comment": "Ha, can't say I didn't see it coming" } ]