0

我正在做与该用户所做的非常相似的事情:尝试将 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)

如果我有正确的 JSON 表示法,那就太好了:

>>> simplejson.loads('{"num1": 1383241561141, "num2": 1000}')
{'num1': 1383241561141, 'num2': 1000}

但是,我没有。我该如何解决这个问题?也许它归结为像正则表达式这样简单的东西?

编辑: Martijn 写的这个正则表达式让我走到了一半,如果我在一些示例数据中出现的大括号后面有尾随空格,它就不起作用,例如{ num1: 1383241561141, num2: 1000}'

4

2 回答 2

0

在 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"
}

请注意字符串数字,如果需要,您可以再次遍历对象并将这些键 Number(val) 返回为实数。

于 2013-11-02T19:03:53.173 回答
0

RSON这样的一些库支持解析所谓的“宽松”JSON 表示法。

根据实际的密钥,如果您不关心安全隐患(永远不要在外部输入上使用它),eval也可以为您提供一个正常工作的字典。

于 2013-11-02T18:20:02.547 回答