2009-08-04 47 views
5

Tôi có một đối tượng JSON tạo trong PHP, mà JSON đối tượng chứa khác thoát JSON chuỗi theo một trong đó là các tế bào:Giải mã JSON phức tạp bằng Python

 
php > $insidejson = array('foo' => 'bar','foo1' => 'bar1'); 
php > $arr = array('a' => array('a1'=>json_encode($insidejson))); 
php > echo json_encode($arr); 
{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}} 

Sau đó, với Python, tôi cố gắng deocding nó bằng cách sử simplejson:

 
>>> import simplejson as json 
>>> json.loads('{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}') 

này không thành công với các lỗi sau:

 
Traceback (most recent call last): 
    File "", line 1, in ? 
    File "build/bdist.linux-i686/egg/simplejson/__init__.py", line 307, in loads 
    File "build/bdist.linux-i686/egg/simplejson/decoder.py", line 335, in decode 
    File "build/bdist.linux-i686/egg/simplejson/decoder.py", line 351, in raw_decode 
ValueError: Expecting , delimiter: line 1 column 14 (char 14) 

Làm thế nào tôi có thể có được điều này đối tượng JSON tháng mười hai oded trong Python? Cả PHP và JS giải mã nó thành công và tôi không thể thay đổi cấu trúc của nó vì nó sẽ yêu cầu những thay đổi lớn trong nhiều thành phần khác nhau trong các ngôn ngữ khác nhau.

Cảm ơn!

Trả lời

9

Hãy thử bắt đầu chuỗi của bạn với 'r' để làm cho nó một chuỗi nguyên:

# Python 2.6.2 
>>> import json 
>>> s = r'{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}' 
>>> json.loads(s) 
{u'a': {u'a1': u'{"foo":"bar","foo1":"bar1"}'}} 

gì Alex nói dưới đây là đúng: bạn chỉ có thể tăng gấp đôi slashes. (Câu trả lời của anh ta không được đăng khi tôi bắt đầu tôi). Tôi nghĩ rằng việc sử dụng các chuỗi thô đơn giản hơn, nếu chỉ vì nó là một tính năng ngôn ngữ có nghĩa là cùng một thứ và khó có thể sai.

+0

nó hoạt động, cảm ơn! –

+0

Có Tôi đồng ý hughdbbrown, tôi đã quên về tính năng chuỗi thô của Python. +1 –

1

Hãy thử

lẽ simplejson là quá nhiều "đơn giản".

+1

"simplejson là phiên bản phát triển được duy trì bên ngoài của thư viện json đi kèm với Python 2.6 và Python 3.0" –

1

Nếu bạn muốn chèn dấu gạch chéo ngược vào chuỗi mà chúng cần tự thoát.

import simplejson as json 
json.loads('{"a":{"a1":"{\\"foo\\":\\"bar\\",\\"foo1\\":\\"bar1\\"}"}}') 

Tôi đã thử nghiệm nó và Python xử lý mà đầu vào tốt - ngoại trừ tôi đã sử dụng các mô-đun json bao gồm trong thư viện chuẩn (import json, Python 3.1).

+0

cảm ơn! điều này cũng hoạt động nhưng tôi thích sử dụng giải pháp của hughdbrown vì nó không yêu cầu thay đổi trong các thành phần khác –

+0

Các giải pháp tương đương, nhưng sử dụng chuỗi thô trông gọn gàng hơn :) –

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