2012-02-08 30 views
26

Tôi đang cố gắng phân tích một đối tượng JSON thành một Python dict. Tôi chưa bao giờ làm điều này trước đây. Khi tôi googled lỗi cụ thể này, (Điều gì là sai với char đầu tiên?), các bài viết khác đã nói rằng chuỗi được tải không thực sự là một chuỗi JSON. Tôi khá chắc chắn đây là, mặc dù.Đang cố gắng phân tích cú pháp JSON bằng Python. ValueError: Mong đợi tên thuộc tính

Trong trường hợp này, eval() hoạt động tốt, nhưng tôi tự hỏi liệu có cách nào phù hợp hơn không?

Lưu ý: Chuỗi này đến trực tiếp từ Twitter, qua công cụ ptt.

>>> import json 
>>> line = '{u\'follow_request_sent\': False, u\'profile_use_background_image\': True, 
     u\'default_profile_image\': False, 
     u\'verified\': False, u\'profile_sidebar_fill_color\': u\'DDEEF6\', 
     u\'profile_text_color\': u\'333333\', u\'listed_count\': 0}' 
>>> json.loads(line) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads 
     return _default_decoder.decode(s) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode 
     obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode 
     obj, end = self.scan_once(s, idx) 
    ValueError: Expecting property name: line 1 column 1 (char 1) 
+8

Đó chỉ là cú pháp python chứ không phải JSON. Sử dụng 'ast.literal_eval' để đánh giá an toàn – JBernardo

Trả lời

28

Đó chắc chắn không phải là JSON - không được in ở trên dù sao đi nữa. Nó đã được phân tích cú pháp thành một đối tượng Python - JSON sẽ có false, không phải False và sẽ không hiển thị các chuỗi là u cho unicode (tất cả các chuỗi JSON là unicode). Bạn có chắc bạn không nhận được chuỗi json của bạn biến thành một đối tượng Python miễn phí ở một nơi nào đó trong chuỗi đã, và do đó tải nó vào json.loads() rõ ràng là sai bởi vì trên thực tế nó không phải là một chuỗi?

+2

Đó chính xác là vấn đề. Cảm ơn. – gabe

27

Đôi khi bạn có thể gặp lỗi này bởi vì giá trị chuỗi của bạn không được nhận dạng bởi python. Ví dụ: Tôi đã dành khá nhiều thời gian tìm kiếm nguồn gốc của loại lỗi này. Đây là những gì tôi tìm thấy.

Đôi khi một ngôn ngữ nhận một loại dấu ngoặc kép và không nhau: btw, để phân tích một chuỗi trong để json trong JavaScript tất cả dấu ngoặc kép phải trong 'định dạng

để phân tích một chuỗi thành json trong JavaScript tất cả các dấu ngoặc kép phải trong "định dạng mà không phải là thực sự lôgic

Hy vọng rằng bạn có thể sử dụng thay thế chức năng Đối với Python:..

json.loads(s.replace("\'", '"')); 

Hy vọng nó sẽ giúp bạn tiết kiệm thời gian tôi đã dành săn này lỗi!

+0

Đó là vấn đề tôi phải đối mặt. Cảm ơn – Alireza

+0

Một phần câu trả lời của bạn liên quan đến các dấu ngoặc kép trong JSON trong JavaScript có vẻ hơi mâu thuẫn. Tôi đã tiếp tục và [thử nghiệm] (https://jsbin.com/pupayajoni/1/edit?js,console) cả hai biến thể trong JavaScript (trong Chrome). Kết quả là: đoạn thứ ba của bạn là đúng: trình phân tích cú pháp JavaScript chuẩn không cho phép các dấu nháy đơn là các chuỗi ký tự bằng chữ. –

+1

BTW [Đặc tả JSON] (http://www.json.org) chỉ cho phép các chuỗi được bao bọc trong dấu ngoặc kép, do đó hành vi này không cụ thể đối với các trình phân tích JSON JavaScript và Python. –

7

Tôi gặp lỗi này khi tôi có dấu phẩy treo ở cuối danh sách thuộc tính. Bởi vì dấu phẩy nó được mong đợi một tên tài sản khác nhưng không có.

+1

Điều ngu ngốc như vậy mà JSON không cho phép dấu phẩy! Và tuyệt đối không-đi mà json.load cung cấp cho bạn chỉ 'ValueError: Mong đợi tên thuộc tính kèm theo trong dấu nháy kép – Ufos

0

Đảm bảo rằng tệp JSON của bạn không có dòng bắt đầu bằng // (sai ý kiến ​​phải có ý kiến!). Tôi có cùng một thông báo ValueError và nó đã biến mất sau khi tôi xóa // khỏi tệp của tôi.

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