2015-01-29 15 views
14

Tôi trích xuất một bảng postgres là json. Các tập tin đầu ra chứa dòng thích:Python json.loads ValueError, mong đợi dấu phân tách

{"data": {"test": 1, "hello": "I have \" !"}, "id": 4} 

Bây giờ tôi cần phải tải chúng trong mã python của tôi sử dụng json.loads, nhưng tôi nhận được lỗi này:

Traceback (most recent call last): 
    File "test.py", line 33, in <module> 
    print json.loads('''{"id": 4, "data": {"test": 1, "hello": "I have \" !"}}''') 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Expecting , delimiter: line 1 column 50 (char 49) 

tôi đã tìm ra giải pháp khắc phục là thêm \ khác đến \". Vì vậy, nếu tôi vượt qua

{"data": {"test": 1, "hello": "I have \\" !"}, "id": 4} 

để json.loads, tôi có được điều này:

{u'data': {u'test': 1, u'hello': u'I have " !'}, u'id': 4} 

Có cách nào để làm điều này mà không cần thêm các phụ \? Giống như chuyển một tham số đến json.loads hoặc một cái gì đó?

+1

hey folks i am có cùng một vấn đề bất kỳ solutuion hợp lệ? –

Trả lời

4

Hãy thử điều này:

json.loads(r'{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}') 

Nếu bạn đã có chuỗi bên trong một biến, sau đó chỉ cần:

json.loads(data.replace("\\", r"\\")) 

Hy vọng nó sẽ giúp!

+1

Tôi sợ nó không hoạt động, ''{" dữ liệu ": {" test ": 1," hello ":" Tôi có \ "!"}, "Id": 4}' 'và' '{ "data": {"test": 1, "hello": "Tôi có \"! "}," id ": 4} '. thay thế (" \\ ", r" \\ ")' là chính xác giống nhau . – AliBZ

+0

@AliBZ Nó không hoạt động vì bạn đang thiếu 'r' trước chuỗi. Sao chép và dán ví dụ đầu tiên của tôi, nó sẽ hoạt động. – cdonts

+0

Tôi có chuỗi của tôi bên trong một biến, đó là lý do tại sao tôi đã sử dụng ví dụ thứ hai của bạn. – AliBZ

15

Bạn có thể chỉ định cái gọi là “chuỗi thô”:

>>> print r'{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}' 
{"data": {"test": 1, "hello": "I have \" !"}, "id": 4} 

Họ không giải thích các dấu xồ nguợc.

dây thông thường thay đổi \" để ", vì vậy bạn có thể có " ký tự trong chuỗi được tự giới hạn bởi dấu ngoặc kép:

>>> "foo\"bar" 
'foo"bar' 

Vì vậy, việc chuyển đổi từ \" để " không được thực hiện bởi json.loads, nhưng bằng Python chinh no.

+0

Tôi đang đọc dòng tệp dữ liệu theo dòng. Vì vậy, tôi có từ điển trong các biến. Tôi đã thử '.replace (" \\ ", r" \\ ")' và '.encode ('string-escape')', không hoạt động. – AliBZ

+0

Trong JSON '" \ "" có nghĩa là ''"' ', cũng giống như trong Python. Nếu có '\" trong tệp đầu vào, nó thực sự là một '" '. Nếu bạn vì một lý do nào đó muốn có 'r '\"' ', bạn sẽ cần' .replace ('"', '\\"') '. – Gandaro

0

Hãy thử cách source.replace('""', '') hoặc thay thế, gây ra "" trong nguồn sẽ làm cho json.loads(source) không thể phân biệt chúng.

Các vấn đề liên quan