正则表达式在javascript中的键周围添加双引号

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并不是一个问题.

  • 完善!对于我的JS朋友来说,`JSON.parse(dirtyJSON.replace(/([[{,])(\ s *)([A-Za-z0-9 _ \-] +?)\ s *:/ g,' $ 1“ $ 3”:'))` (2认同)

小智 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标准(允许名称中的单引号)更进一步限制你,但是你将无法使用此方法进行解析.你可以用这个表达式在这里有各种各样的东西([^'":]+),所以要小心.

希望这可以帮助.


Poi*_*nty 2

编辑- 首先指出,这不是一个可以用正则表达式解决的问题。

区分序列化形式的 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()”对其进行评估。