2009-12-19 30 views
26

Tôi có một chuỗi JSON sau đến từ nguồn đầu vào bên ngoài:Làm cách nào để phân tích cú pháp JSON sai với Python?

{value: "82363549923gnyh49c9djl239pjm01223", id: 17893} 

Đây là sai định dạng chuỗi JSON ("id" và "giá trị" phải nằm trong dấu ngoặc kép), nhưng tôi cần phải phân tích nó anyway. Tôi đã thử simplejson và json-py và dường như họ không thể được thiết lập để phân tích các chuỗi như vậy.

Tôi đang chạy Python 2.5 trên công cụ Google App, vì vậy, mọi giải pháp dựa trên C như python-cjson đều không được áp dụng.

Định dạng đầu vào có thể được thay đổi thành XML hoặc YAML, theo JSON được liệt kê ở trên, nhưng tôi đang sử dụng JSON trong dự án và thay đổi định dạng ở địa điểm cụ thể sẽ không tốt lắm.

Bây giờ tôi đã chuyển sang XML và phân tích dữ liệu thành công, nhưng mong muốn bất kỳ giải pháp nào có thể cho phép tôi chuyển về JSON.

+0

Tôi hơi bối rối về cách bạn có thể chuyển sang XML, nhưng không kiểm soát được dữ liệu JSON. Có vẻ như bạn có một số nguồn dữ liệu bên ngoài, ở định dạng XML hoặc JSON, nhưng đầu ra JSON của nó bị hỏng vĩnh viễn như được hiển thị và bạn không thể làm gì về nó để lựa chọn duy nhất của bạn là chọn phiên bản XML thay thế? Hay tôi đang thiếu một cái gì đó? –

+0

bạn có thể phân tích nó thành YAML mà không thay đổi, vì nó là YAML quá – mykhal

+0

Peter, bạn nói đúng - tôi có một nguồn dữ liệu bên ngoài mà tôi có thể kiểm soát chỉ bằng một cách - bằng cách nói rằng tôi muốn đầu vào trong JSON, XML hoặc YAML. Nadia, cảm ơn - đó là lỗi của tôi (và do tôi không quen thuộc với giao diện Stackoverflow tại thời điểm đó). –

Trả lời

31

từ YAML (> = 1.2) là một superset của JSON, bạn có thể làm:

>>> import yaml 
>>> s = '{value: "82363549923gnyh49c9djl239pjm01223", id: 17893}' 
>>> yaml.load(s) 
{'id': 17893, 'value': '82363549923gnyh49c9djl239pjm01223'} 
+0

tốt, python-yaml (PyYAML) chưa hoàn toàn tuân thủ 1.2, nhưng sẽ xử lý hầu hết các trường hợp. để chuẩn bị cho các trường hợp sự cố, hãy xem http://en.wikipedia.org/wiki/YAML#cite_ref-6 – mykhal

+0

mykhal, bạn có chạy nó trên Google App Engine không? Có vẻ PyYAML sử dụng các mô-đun C và do đó không thể được sử dụng trên GAE. –

+0

pyyaml ​​là nhanh hơn nhiều, nếu sử dụng libyaml, nhưng nó cũng được viết bằng python tinh khiết, và bạn có thể chọn giữa CLoader o Loader (py tinh khiết). Nhưng đừng lo, hỗ trợ yaml đã được bao gồm trong công cụ ứng dụng, bạn có thể thử điều này trong trình vỏ tương tác http://shell.appspot.com/ – mykhal

1

Bạn có thể sử dụng trình phân tích cú pháp chuỗi để sửa lỗi trước, một regex có thể làm điều đó miễn là điều này phức tạp như JSON sẽ nhận được.

+0

Điều này là có thể, nhưng tôi đang xem xét loại giải pháp như vậy là lạ, vì vậy bây giờ tôi chỉ đang tìm kiếm một thư viện phân tích cú pháp json có thể xử lý JSON bị hỏng này. –

0

Pyparsing bao gồm một ví dụ JSON phân tích cú pháp, đây là online source. Bạn có thể sửa đổi định nghĩa của memberDef để cho phép một chuỗi không được trích dẫn cho tên thành viên, và sau đó bạn có thể sử dụng nó để phân tích cú pháp văn bản nguồn không phải là JSON của bạn.

This page cũng có thông tin và liên kết đến bài viết của tôi trong số ra tháng 8 năm 2008 của Tạp chí Python, có nhiều thông tin chi tiết hơn về trình phân tích cú pháp này. Trang này hiển thị một số JSON mẫu và mã truy cập các kết quả được phân tích cú pháp giống như nó là một đối tượng được deserialized.

13

Bạn có thể sử dụng demjson.

>>> import demjson 
>>> demjson.decode('{foo:3}') 
{u'foo': 3} 
+0

Điều đó đã giúp tôi phân tích cú pháp JSON mà không có dấu ngoặc kép và với định dạng khác với yaml – varela

+0

gói rất hữu ích để phân tích cú pháp json bị hỏng, cảm ơn – Johnner

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