Javascript 解析不包含';t使用字符串作为属性名(使用python和BeautifulSoup)

Javascript 解析不包含';t使用字符串作为属性名(使用python和BeautifulSoup),javascript,python,regex,json,python-2.6,Javascript,Python,Regex,Json,Python 2.6,我正在做一件非常类似的事情:尝试将javascript对象声明加载到python字典中。但是,与该用户不同,属性名称不包含在引号中 >>> simplejson.loads('{num1: 1383241561141, num2: 1000}') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/lalalal/site-pack

我正在做一件非常类似的事情:尝试将javascript对象声明加载到python字典中。但是,与该用户不同,属性名称不包含在引号中

>>> simplejson.loads('{num1: 1383241561141, num2: 1000}')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/lalalal/site-packages/simplejson/__init__.py", line 385, in loads
    return _default_decoder.decode(s)
  File "/Users/lalalal/site-packages/simplejson/decoder.py", line 402, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Users/lalalal/site-packages/simplejson/decoder.py", line 418, in raw_decode
    obj, end = self.scan_once(s, idx)
simplejson.decoder.JSONDecodeError: Expecting property name: line 1 column 1 (char 1)
但是,我没有。我怎样才能解决这个问题?也许可以归结为像正则表达式这样简单的东西

编辑:Martijn写的这篇文章让我半途而废,如果在我的一些示例数据中的大括号后面有尾随空格,那就不起作用了,例如,
{num1:138341561141,num2:1000}

一些库支持解析所谓的“松弛”JSON符号


根据实际的密钥,如果您不关心安全问题(永远不要在外部输入中使用此选项),
eval
也可以为您提供一个功能强大的字典。

在js中执行此操作的一种简单方法:

'{num1: 1383241561141, num2: 1000}'   // the string
  .trim()                             // remove whitespace
  .slice(1,-1)                        // remove endcap braces
  .trim()                             // remove whitespace
  .split(/\s*,\s*/).map(function(a){  // loop through each comma section names as a
     var p=a.split(/\s*:\s*/);        // split section into key/val segments
     this[p[0]]=p[1];                 // assign val to collection under key
     return this;                     // return collection
},{})[0];                             // grab the return once (same on each index)
此例程返回如下字符串化的活动对象:

{
    "num1": "1383241561141",
    "num2": "1000"
}

注意字符串编号,您可以再次循环对象,并根据需要将这些键编号(val)为实数。

我将使用regexp引用这些键,然后将其解析为JSON。(/,(\w)+:/g',“$1:”),然后使用字符串方法手动清理第一个键和最后一个键的字符串。这样,JSON仍然起着重要作用,您只需要以可预测的方式删除一些可预测的字符串。@dandavis这段代码应该是什么?调用
re.sub
?它是调用JS的replace方法的参数。python应该有一些相关的东西,我只是承认我已经很久没有使用python了,请原谅。不用担心。这让我很反感,因为它们的正则表达式语法略有不同,但我理解这种方法。我不想使用其他库,不幸的是,在这种情况下我不能使用
eval
(不安全!)。不过还是要谢谢你。我无法用纯Python找到解决方案,所以我接受了这个答案,因为它可以解决其他人的问题。不幸的是,我被迫用Python来做这件事,但谢谢你的js代码片段:)啊,我看不出你需要用Python。。。好了,现在您可以看到一个有效的例程,将其转换为python。我知道python有你需要的部分,它是什么,6行代码?是的,没错。不过,我想我必须担心val字符串中的逗号和冒号。我可能不知道那些
split
s在javascript中是如何工作的(我是新手),但是,我认为他们会在这方面出错,对吗?@2rs2ts:你的演示数据可以用一种简单的方法工作。你可以做一个逐字符的解析器,这实际上有点有趣,也不像听起来那么难,但我认为RegExp到JSON的路由是最简单的,如果你能让它接受。。。
{
    "num1": "1383241561141",
    "num2": "1000"
}