2012-02-01 22 views
6

Tôi quan tâm đến việc simplejson.loads() phân tích thành công như sau:Có cách nào để làm cho simplejson kém nghiêm ngặt hơn không?

{foo:3} 

Nó ném một JSONDecodeError nói "mong đợi tên thuộc tính" nhưng trên thực tế nó nói "Tôi yêu cầu ngoặc kép quanh tên thuộc tính của tôi". Điều này gây phiền toái cho trường hợp sử dụng của tôi và tôi thích một hành vi ít nghiêm ngặt hơn. Tôi đã đọc các tài liệu, nhưng ngoài việc làm cho lớp giải mã của riêng tôi, tôi không thấy bất cứ điều gì rõ ràng rằng thay đổi hành vi này.

+1

Vì vậy, bạn muốn 'simplejson' chấp nhận điều gì đó không hợp lệ JSON? (Đó là JavaScript nơi các dấu ngoặc kép là tùy chọn. Trong JSON chúng bắt buộc.) – millimoose

+0

Yup, đó là chính xác những gì tôi muốn. :) – slacy

+0

Điều tôi ngụ ý là "đây là điều bạn không nên muốn ngay từ đầu." – millimoose

Trả lời

10

bạn có thể sử dụng YAML (> = 1,2) vì nó là một superset của JSON, bạn có thể làm:

>>> import yaml 
>>> s = '{foo: 8}' 
>>> yaml.load(s) 
{'foo': 8} 
+0

Ồ, đây chính là điều tôi muốn. Cảm ơn! – slacy

+1

@slacy Tôi chỉ nhận thấy rằng yaml cần một không gian sau khi colon.I nghĩ rằng điều này sẽ làm hỏng bữa tiệc của bạn. – RanRag

+1

Có, trừ khi RHS là một mảng. {foo: [bar]} là tốt, đó thực sự là những gì tôi đang làm. – slacy

1

Không, điều này là không thể. Để phân tích cú pháp thành công bằng cách sử dụng simplejson, trước tiên bạn cần chuyển đổi nó thành một chuỗi JSON hợp lệ.

Tùy thuộc vào mức độ nghiêm ngặt của định dạng chuỗi đến của bạn là điều này có thể khá đơn giản hoặc cực kỳ phức tạp.

Đối với một trường hợp đơn giản, nếu bạn sẽ luôn có một đối tượng JSON mà chỉ có chữ và nhấn vào phím (không có dấu ngoặc kép) và số nguyên như các giá trị, bạn có thể sử dụng sau đây để biến nó thành JSON hợp lệ:

import re 
your_string = re.sub(r'([a-zA-Z_]+)', r'"\1"', your_string) 

Ví dụ:

>>> re.sub(r'([a-zA-Z_]+)', r'"\1"', '{foo:3, bar:4}') 
'{"foo":3, "bar":4}' 
2

Bạn có thể thử demjson.

>>> import demjson 
>>> demjson.decode('{foo:3}') 
{u'foo': 3} 
Các vấn đề liên quan