2016-01-13 56 views
2

我有以下字符串加载Python字符串与“U”为JSON

json_string = '{u"favorited": false, u"contributors": null}' 
json_string1 = '{"favorited": false, "contributors": null}' 

以下JSON负载正常工作的字符串。

json.loads(json_string1) 

但是,下面的json加载给我值错误,如何解决这个问题?

json.loads(json_string) 
ValueError: Expecting property name: line 1 column 2 (char 1) 
+3

'u'前缀字符串不属于JSON规范。你为什么要'json.loads'接受它(或者你的真实*问题是什么)? –

+0

我得到这些类型的字符串,通过类型铸造一个字典,表示一个JSON字符串'str(json_dict)'。 –

+0

你使用什么版本的Python?如果这是Python3.x,它将不适合你,因为在Python3.x中不再有像'unicode'这样的东西。 – PatNowak

回答

1

使用json.dumps到Python字典转换为字符串,不str。然后,你可以期望json.loads工作:

错误:

>>> D = {u"favorited": False, u"contributors": None} 
>>> s = str(D) 
>>> s 
"{u'favorited': False, u'contributors': None}" 
>>> json.loads(s) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "D:\dev\Python27\lib\json\__init__.py", line 339, in loads 
    return _default_decoder.decode(s) 
    File "D:\dev\Python27\lib\json\decoder.py", line 364, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "D:\dev\Python27\lib\json\decoder.py", line 380, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Expecting property name: line 1 column 2 (char 1) 

正确:

>>> D = {u"favorited": False, u"contributors": None} 
>>> s = json.dumps(D) 
>>> s 
'{"favorited": false, "contributors": null}' 
>>> json.loads(s) 
{u'favorited': False, u'contributors': None} 
1

你可以使用正则表达式去掉字符串中的u后缀,然后加载JSON

s = '{u"favorited": false, u"contributors": null}' 
json_string = re.sub('(\W)\s*u"',r'\1"', s) 
json.loads(json_string) 
0

我面临同样的问题,我收到来自客户的字符串。弦乐随你而来。我发现使用AST包解决方法:

import ast 
import json 

my_str='{u"favorited": false, u"contributors": null}' 
my_str=my_str.replace('"',"'") 
my_str=my_str.replace(': false',': False') 
my_str=my_str.replace(': null',': None') 
my_str = ast.literal_eval(my_str) 
my_dumps=json.dumps(my_str) 
my_json=json.loads(my_dumps) 

注意更换的“假”和“空”的“假”和“无”,因为literal_eval只能识别特定类型的Python字面结构。这意味着如果您的代码中可能需要更多替代品 - 取决于您收到的字符串。