2016-01-13 51 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字面結構。這意味着如果您的代碼中可能需要更多替代品 - 取決於您收到的字符串。