2013-11-02 46 views
0

我正在做一件非常类似于this user was doing的东西:尝试将一个javascript对象声明加载到python字典中。但是,与该用户不同,属性名称不包含在引号中。解析不使用字符串属性名称的javascript对象声明

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

但是,我不知道。我该如何解决这个问题?也许它归结为像正则表达式一样简单?

编辑This regex说的Martijn写有我一半了,只是如果我有这发生在我的一些示例数据,例如的括号后尾随空白不起作用{ num1: 1383241561141, num2: 1000}'

+0

我会使用正则表达式来引用键,然后将其解析为JSON。 (/,(\ w)+:/ g,',“$ 1”:'),然后使用字符串方法手动清理第一个和最后一个键的字符串。这样,JSON仍然可以完成繁重的工作,而且您只需要以可预测的方式清理一些可预测的字符串。 – dandavis

+0

@dandavis这段代码应该是什么?调用're.sub'? – 2rs2ts

+1

它的参数调用JS的替换方法。 python应该有一些相关的东西,从我使用python的时候就已经很久了,原谅了我。 – dandavis

回答

0

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

根据实际的密钥,如果您不关心安全隐患(从不在外部输入中使用此密钥),eval也可能会为您提供功能词典。

+0

我不想使用另一个库,不幸的是,在这种情况下我不能使用'eval'(不安全!)。但是,谢谢你。 – 2rs2ts

+0

我无法在纯Python中找到解决方案,所以我接受了这个答案,因为它会为其他人解决问题。 – 2rs2ts

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) 

这个例程返回该stringifys像这样的活动对象:,你又可以通过对象循环

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

音符串号和数字(val)这些键返回到实际的数字,如果需要的话。

+0

不幸的是,我不得不在Python中这样做,但感谢你的JS代码:) – 2rs2ts

+0

啊,我没有看到你需要它在Python中......好吧,现在你可以看到一个可以运行的例程,把它翻译成python。我知道Python有你需要的部分,这是6行代码? – dandavis

+0

是的,确切地说。不过,我认为我必须担心我的val字符串中的逗号和冒号。我可能会错过那些'split'在javascript中工作(我是新手),但是,我认为他们会在这里绊倒,对吧? – 2rs2ts

相关问题