Evi*_*l E 5 javascript regex json
我正在使用jQuery的getJSON函数来发出请求并处理JSON响应.问题是我回来的反应是不正确的,我无法改变它.响应看起来像这样:
{
aNumber: 200,
someText: '\'hello\' world',
anObject: {
'foo': 'fooValue',
'bar': '10.0'
}
}
Run Code Online (Sandbox Code Playgroud)
要成为有效的JSON,它应该如下所示:
{
"aNumber": 200,
"someText": "'hello' world",
"anObject": {
"foo": "fooValue",
"bar": "10.0"
}
}
Run Code Online (Sandbox Code Playgroud)
我想将返回的文本更改为有效的JSON对象.我已经使用javascript替换函数将单引号转换为双引号并将转义的单引号转换为单引号,但现在我仍然坚持找出在键值附近添加引号的最佳方法.例如,我如何将foo:"fooValue"更改为"foo":"fooValue"?是否有正则表达式可以使这很容易?
提前致谢!
Guy*_*Guy 11
这个正则表达式将成功
$json = preg_replace('/([{,])(\s*)([A-Za-z0-9_\-]+?)\s*:/','$1"$3":',$json);
Run Code Online (Sandbox Code Playgroud)
这是一个PHP!我认为将它转换为JS并不是一个问题.
小智 8
我试图在Javascript中使用regEx来解决同样的问题.我有一个为Node.js编写的应用程序来解析传入的JSON,但是想要解析器的"宽松"版本(参见下面的注释),因为在每个键(名称)周围放置引号是不方便的.这是我的解决方案:
var objKeysRegex = /({|,)(?:\s*)(?:')?([A-Za-z_$\.][A-Za-z0-9_ \-\.$]*)(?:')?(?:\s*):/g;// look for object names
var newQuotedKeysString = originalString.replace(objKeysRegex, "$1\"$2\":");// all object names should be double quoted
var newObject = JSON.parse(newQuotedKeysString);
Run Code Online (Sandbox Code Playgroud)
以下是regEx的细分:
({|,)查找对象的开头,{查找平面对象或,嵌入对象.(?:\s*) 发现但不记得空白区域(?:')?发现但不记得单引号(稍后将被双引号替换).这些将是零或其中之一.([A-Za-z_$\.][A-Za-z0-9_ \-\.$]*)是名称(或键).从任何字母,下划线,$或点开始,后跟零个或多个字母数字字符或下划线或短划线或点或$.:是从值中分隔对象名称的内容.现在我们可以使用replace()一些敷料来获取我们新引用的键:
originalString.replace(objKeysRegex, "$1\"$2\":")
Run Code Online (Sandbox Code Playgroud)
其中$1是{或者,取决于对象是否嵌入在另一个对象中. \"添加双引号. $2是名字.\"另一个双引号.最后:完成它.测试一下
{keyOne: "value1", $keyTwo: "value 2", key-3:{key4:18.34}}
Run Code Online (Sandbox Code Playgroud)
输出:
{"keyOne": "value1","$keyTwo": "value 2","key-3":{"key4":18.34}}
Run Code Online (Sandbox Code Playgroud)
一些评论:
eval()([A-Za-z_$\.][A-Za-z0-9_ \-\.$]*)用于我的'宽松'版本JSON解析器.如果你想在名称中允许更多的字符(你可以这样做并且仍然有有效的JSON),你可以([^'":]+)用来表示除双引号或单引号或冒号之外的任何字符.这仍然会比JSON标准(允许名称中的单引号)更进一步限制你,但是你将无法使用此方法进行解析.你可以用这个表达式在这里有各种各样的东西([^'":]+),所以要小心.希望这可以帮助.
编辑- 首先指出,这不是一个可以用正则表达式解决的问题。
区分序列化形式的 JSON 表示法和 JavaScript 对象常量表示法很重要。
这:
{ x: "hello" }
Run Code Online (Sandbox Code Playgroud)
是一个完全有效的 JavaScript 值(表达式片段),因此:
var y = { x: "hello" };
Run Code Online (Sandbox Code Playgroud)
给出与以下完全相同的结果:
var y = { "x": "hello" };
Run Code Online (Sandbox Code Playgroud)
换句话说,在这两种情况下,“y”的值将完全相同。完全一样,以至于不可能知道这两个常量中的哪一个用于初始化“y”。
现在,如果您想要做的是将包含不带引号的 JavaScript 样式“JSON 速记”的字符串转换为有效的 JSON,则唯一要做的就是解析它并在属性名称周围使用引号重建字符串。也就是说,您必须编写自己的“宽松”JSON 解析器,才能处理不带引号的标识符作为属性名称,或者找到一个可以处理此类宽松语法的现成解析器。
就您而言,看起来一旦您拥有可用的“宽松”解析器,您就完成了;您不需要翻译回来。值得庆幸的是,您的“无效”JSON 响应完全可以由 JavaScript 本身解释,因此如果您信任数据源(这是一个很大的“如果”),您应该能够使用“eval()”对其进行评估。