2009-10-10 32 views
6

Tôi đang sử dụng ví dụ JSON ra khỏi web, như được thấy bên dưới.Trợ giúp với định dạng JSON

{ 
    "menu": "File", 
    "commands": [ 
     { 
      "title": "New", 
      "action":"CreateDoc" 
     }, 
     { 
      "title": "Open", 
      "action": "OpenDoc" 
     }, 
     { 
      "title": "Close", 
      "action": "CloseDoc" 
     } 
    ] 
} 

Tôi đã thử tải trong hai trình phân tích cú pháp khác nhau, một trong C++ và bằng Python.

Đây là traceback của Python.

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/json/__init__.py", line 267, in load 
    parse_constant=parse_constant, **kw) 
    File "/usr/lib/python2.6/json/__init__.py", line 307, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.6/json/decoder.py", line 319, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.6/json/decoder.py", line 338, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

Và đây là những gì jsoncpp báo cáo.

* Line 1, Column 1 
    Syntax error: value, object or array expected. 

Bất kỳ đầu mối nào tôi đang làm sai?

Chỉnh sửa:

Ok, đây là một số mã. Đối với một số lý do bây giờ Python làm việc. Tôi không làm gì ngoài đi đến cửa hàng. Đó phải là một tính năng Python - goto cửa hàng, các lỗi ngẫu nhiên biến mất. Những người phát triển Python là những thiên tài.

Nhưng đến thời điểm này. Đây là mã C++.

bool CFG::CFG_Init(const char* path) { 
    bool r = reader.parse(path, root); 
    if(r) { 
     return true; 
    } else { 
     std::cout << reader.getFormatedErrorMessages() << std::endl; 
     return false; 
    } 
} 

Tôi đã thử điều này khi 'đường dẫn' là chuỗi tiêu chuẩn :: giống nhau. Tôi gọi phương thức như sau:

if(!CFG_Init("test.json")) { 
    error("Couldn't load configuration."); 
} 

Và đây là lớp học.

class CFG: virtual Evaluator { 
    Json::Reader reader; 
    public: 
    Json::Value root; 
    bool CFG_Init(const char* path); 
    Json::Value CFG_Fetch_Raw(Json::Value section, std::string key, Json::Value defval); 
    Json::Value CFG_Fetch(Json::Value section, std::string key, Json::Value defval); 
}; 
+3

Làm thế nào để hiển thị mã bạn đang sử dụng để giải mã nó thay vì khiến chúng tôi đoán? –

+0

@Paul Tôi đoán anh ta chỉ nhập dữ liệu với một trình nhập JSON thuần túy –

+0

@Stefano Có, nhưng vì JSON đó là hoàn toàn tốt, thủ phạm có thể là mã của anh ấy (trong cách anh ta tải tệp vào hoặc gọi mã JSON) có một số lỗi. Vì vậy, hiển thị mã mà anh ấy đang sử dụng để tải nó sẽ giúp chúng tôi chẩn đoán sự cố. –

Trả lời

1

Đó là trình phân tích cú pháp của bạn. Tôi có thể nhập chính xác tệp với trình phân tích cú pháp đơn giản trong django

>>> from django.utils import simplejson as sj 
>>> f=file("x.json") 
>>> sj.load(f) 
{u'menu': u'File', u'commands': [{u'action': u'CreateDoc', u'title': u'New'}, {u'action': u'OpenDoc', u'title': u'Open'}, {u'action': u'CloseDoc', u'title': u'Close'}]} 
>>> 
+1

Không theo thông số kỹ thuật JSON. Các khóa là các chuỗi và các chuỗi được bao quanh bởi dấu ngoặc kép. –

+1

Phím tắt đó chỉ dành cho các nguồn JavaScript thích hợp json yêu cầu các khóa là chuỗi - được trích dẫn. Kiểm tra xem nó ra http://json.org/ – BaroqueBobcat

+0

Vì vậy tôi sai;) –

1

JSON đó trông hoàn toàn ổn. Tôi sẽ kiểm tra mã mà bạn đang sử dụng để tải nó, để đảm bảo rằng bạn đang tải tập tin đó một cách chính xác, và sử dụng mã hóa bên phải để đọc tệp từ đĩa. Đảm bảo bạn không gặp bất kỳ sự cố nào khi cố gắng đọc tệp UTF-16 dưới dạng UTF-8 hoặc cố gắng đọc các dòng bị CRLF kết thúc bằng thứ gì đó mong đợi dòng hoặc đọc tệp bắt đầu bằng BOM có mã không biết cách bỏ qua, hoặc bất kỳ thứ gì sắp xếp. Hãy xem các tập tin trong một trình soạn thảo hex để kiểm tra cho bất kỳ nhân vật vô hình có thể được ném những thứ đi.

11

Ok, sau khi xem mã của jsoncpp, tôi nhận ra lỗi của mình. Nó muốn tài liệu dưới dạng một chuỗi chứ không phải tên tệp.

+0

+1 Để trở thành câu trả lời đúng. – Corvusoft

+0

Tôi nhận được chính xác cùng một vấn đề với 'jsoncpp' nhưng nó không phải là tên tập tin so với chuỗi thingy. Đấu tranh trên ... – akauppi

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