2010-12-14 28 views
5

Tôi đang cố gắng sử dụng jsoncpp để phân tích cú pháp tập hợp json. Các json đã được tạo ra từ một trang web với simplejson từ một đối tượng django. Tôi nhận được nó từ một URL cụ thể bằng cách sử dụng libcurl. Khi tôi sử dụng hàm toStyledString() trên thư mục gốc, tôi nhận được bản in này.Các sự cố khi nhận nút ra khỏi JSON với jsoncpp

[ 
    { 
     "fields" : { 
     "desc" : "Carol King test", 
     "format" : "1", 
     "genre" : "Pop", 
     "mount" : "CarolKing", 
     "name" : "Carol King", 
     "protocol" : "0", 
     "songs" : [ 27, 28, 29, 30, 31, 32, 33, 34 ], 
     "url" : "http://192.168.0.5:8000/CarolKing" 
     }, 
     "model" : "music.playlist", 
     "pk" : 2 
    } 
] 

Vì vậy, có vẻ như tôi đang nhận được dữ liệu đúng và trong lớp Json :: Value.

Vấn đề là im không thể lấy một nút cụ thể ra khỏi cấu trúc json. Đây là mã im sử dụng.

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sstream> 
#include <curl/curl.h> 
#include <string> 
#include "Parameter.h" 
#include "lib_json/json.h" 

using namespace std; 

static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    cout << "-->write_data " << endl; 
    string buf = string(static_cast<char *>(ptr), size *nmemb); 
    stringstream * response = static_cast<stringstream *>(stream); 
    response->write(buf.c_str(), (streamsize)buf.size()); 
    return size * nmemb; 

} 


int main(int sys_argc, char ** sys_argv) { 
    CURL *curl; 
    CURLcode res; 
    stringstream response; 
    string error; 

    char ** argv = sys_argv; 


    string file = argv[1]; 
    Parameter *parms = new Parameter(file); 
    parms->ReadParameters(); 

    cout << "URL: " << parms->GetParameter("URL"); 


    curl_global_init(CURL_GLOBAL_ALL); 
    curl = curl_easy_init(); 
    if(curl) 
    { 
     curl_easy_setopt(curl, CURLOPT_URL, parms->GetParameter("URL").c_str()); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); 
     res = curl_easy_perform(curl); 

     cout << "Playlists-JSON: " << response.str() << endl; 
     curl_easy_cleanup(curl); 
    } 

    Json::Value root; 
    Json::Reader reader; 

    bool parsingSuccessful = reader.parse(response.str(), root); 

    if(!parsingSuccessful) 
    { 
     cout << "Failed to parse configuration. " << reader.getFormatedErrorMessages(); 
     return 16; 
    } 

    cout << "Pretty-Print: " << root.toStyledString() << endl; 
    const Json::Value fields = root["fields"]["songs"]; 


    return 0; 
} 

vì một vấn đề khác tôi không sử dụng các thư viện thực tế libjson.so chia sẻ, im chỉ kéo trong các tập tin và biên dịch chúng trong với nguồn của tôi (Tôi đoán đây là xấu, nhưng vấn đề đó là không phải là điểm của câu hỏi này). Dưới đây là cách cấu trúc thư mục src của tôi.

.: 
bird Bird.cpp fopen.cpp fopen.h lib_json Parameter.cpp Parameter.h 

./lib_json: 
autolink.h features.h json_batchallocator.h json_internalarray.inl json_reader.cpp json_valueiterator.inl reader.h value.h 
config.h forwards.h json.h     json_internalmap.inl json_value.cpp json_writer.cpp   sconscript writer.h 

và đây là đầu ra của chế tạo.

[email protected]:/local/Documents/inthebackground/Box/Bird/bird/Debug$ make 
Building file: ../src/lib_json/json_reader.cpp 
Invoking: GCC C++ Compiler 
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/lib_json/json_reader.d" -MT"src/lib_json/json_reader.d" -o"src/lib_json/json_reader.o" "../src/lib_json/json_reader.cpp" 
Finished building: ../src/lib_json/json_reader.cpp 

Building file: ../src/lib_json/json_value.cpp 
Invoking: GCC C++ Compiler 
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/lib_json/json_value.d" -MT"src/lib_json/json_value.d" -o"src/lib_json/json_value.o" "../src/lib_json/json_value.cpp" 
Finished building: ../src/lib_json/json_value.cpp 

Building file: ../src/lib_json/json_writer.cpp 
Invoking: GCC C++ Compiler 
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/lib_json/json_writer.d" -MT"src/lib_json/json_writer.d" -o"src/lib_json/json_writer.o" "../src/lib_json/json_writer.cpp" 
Finished building: ../src/lib_json/json_writer.cpp 

Building file: ../src/Bird.cpp 
Invoking: GCC C++ Compiler 
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Bird.d" -MT"src/Bird.d" -o"src/Bird.o" "../src/Bird.cpp" 
Finished building: ../src/Bird.cpp 

Building file: ../src/Parameter.cpp 
Invoking: GCC C++ Compiler 
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Parameter.d" -MT"src/Parameter.d" -o"src/Parameter.o" "../src/Parameter.cpp" 
../src/Parameter.cpp: In member function ‘int Parameter::ReadParameters()’: 
../src/Parameter.cpp:47: warning: comparison between signed and unsigned integer expressions 
Finished building: ../src/Parameter.cpp 

Building file: ../src/fopen.cpp 
Invoking: GCC C++ Compiler 
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/fopen.d" -MT"src/fopen.d" -o"src/fopen.o" "../src/fopen.cpp" 
Finished building: ../src/fopen.cpp 

Building target: Bird 
Invoking: GCC C++ Linker 
g++ -L"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/lib" -o"Bird" ./src/lib_json/json_reader.o ./src/lib_json/json_value.o ./src/lib_json/json_writer.o ./src/Bird.o ./src/Parameter.o ./src/fopen.o -lcurl 
Finished building target: Bird 

và từ tất cả điều đó tôi nhận được đầu ra sau khi tôi thực hiện Bird

*Bird: ../src/lib_json/json_value.cpp:1025: Json::Value& Json::Value::resolveReference(const char*, bool): Assertion `type_ == nullValue || type_ == objectValue' failed.* 
URL: 127.0.0.1:8000/playlist-->write_data 
Playlists-JSON: [{"pk": 2, "model": "music.playlist", "fields": {"protocol": "0", "name": "Carol King", "format": "1", "url": "http://192.168.0.5:8000/CarolKing", "mount": "CarolKing", "genre": "Pop", "songs": [27, 28, 29, 30, 31, 32, 33, 34], "desc": "Carol King test"}}] 
Pretty-Print: [ 
    { 
     "fields" : { 
     "desc" : "Carol King test", 
     "format" : "1", 
     "genre" : "Pop", 
     "mount" : "CarolKing", 
     "name" : "Carol King", 
     "protocol" : "0", 
     "songs" : [ 27, 28, 29, 30, 31, 32, 33, 34 ], 
     "url" : "http://192.168.0.5:8000/CarolKing" 
     }, 
     "model" : "music.playlist", 
     "pk" : 2 
    } 
] 

Tôi chưa nhận được vấn đề nếu tôi nhận xét ra dòng này

const Json::Value fields = root["songs"]; 

Im hoàn toàn mở cửa cho thực tế là im đang làm gì đó sai ở đây. Nhưng tôi chỉ không biết nó là gì. Vì vậy, nguyên nhân gây ra lỗi:

Bird: ../src/lib_json/json_value.cpp:1025: Json::Value& Json::Value::resolveReference(const char*, bool): Assertion `type_ == nullValue || type_ == objectValue' failed. 

cảm ơn bạn đã giúp đỡ.

Cheers

Đánh dấu

Trả lời

7

Vì vậy, một lần nữa, đó là trường hợp không hiểu chuyện gì đang diễn ra.

Bởi vì cấu trúc json của tôi là từ một mô hình Django nó đã thực sự và mảng của json (tôi biết im sẽ nhận được các thuật ngữ sai ở đây, và tôi xin lỗi trước).Điều này có thể được tìm thấy từ đoạn mã sau:

cout << "type: " << root.type() << endl; 

với sản lượng sau

type: 6 

trong jsoncpp, điều này có nghĩa một mảng của json. Điều này cũng có thể được suy ra từ Styledoutput từ các dấu ngoặc vuông bắt đầu và kết thúc. Cũng từ enum này trong value.h bắt đầu trên dòng 23

enum ValueType 
    { 
     nullValue = 0, ///< 'null' value 
     intValue,  ///< signed integer value 
     uintValue,  ///< unsigned integer value 
     realValue,  ///< double value 
     stringValue, ///< UTF-8 string value 
     booleanValue, ///< bool value 
     arrayValue, ///< array value (ordered list) 
     objectValue ///< object value (collection of name/value pairs). 
    }; 

Điều này khó nói hơn vì tôi chỉ có một hàng dữ liệu sắp ra khỏi Mô hình Django của tôi vào thời điểm đó. Như tôi đã hiểu bây giờ, tôi đã cố gắng thực hiện một thao tác cho một cấu trúc json đối tượngValue type, khi tôi thực sự cần chọn vị trí mảng ban đầu trước tiên.

Vì vậy, để thực sự nhận được tại url tôi cần phải làm một cái gì đó như thế này.

for(int i = 0; i < root.size(); i++) 
    { 
     cout << root[i]["fields"]["url"].asString() << endl; 
    } 

đó sẽ giúp bạn có

http://192.168.0.5:8000/CarolKing 
http://192.168.0.5:8000/CarolKing2 

từ json sau

[ 
    { 
     "fields" : { 
     "desc" : "Carol King test", 
     "format" : "1", 
     "genre" : "Pop", 
     "mount" : "CarolKing", 
     "name" : "Carol King", 
     "protocol" : "0", 
     "songs" : [ 27, 28, 29, 30, 31, 32, 33, 34 ], 
     "url" : "http://192.168.0.5:8000/CarolKing" 
     }, 
     "model" : "music.playlist", 
     "pk" : 2 
    }, 
    { 
     "fields" : { 
     "desc" : "Second carol King", 
     "format" : "1", 
     "genre" : "Pop", 
     "mount" : "CarolKing2", 
     "name" : "Carol King 2", 
     "protocol" : "0", 
     "songs" : [ 26, 27, 28, 29, 30 ], 
     "url" : "http://192.168.0.5:8000/CarolKing2" 
     }, 
     "model" : "music.playlist", 
     "pk" : 35 
    } 
] 

Im đặt này ở đây để nếu bất cứ ai khác đi qua này, họ ít nhất sẽ có một số cách để tìm những gì là sai.

Cheers

Đánh dấu

1

Xin lỗi,

Nhưng

const Json::Value fields = root["songs"]; 

Không nên

const Json::Value fields = root["fields"]; 

bài hát được lồng vào các lĩnh vực, vì vậy để có được những bài hát bạn nên truy cập trang này như sau:

const Json::Value songs = root["fields"]["songs"]; 

Không?

+0

vâng thats quyền. Nhưng tôi vẫn gặp lỗi tương tự. Tôi sẽ cập nhật Mã trong các câu hỏi. Tốt tại chỗ tho! –

+1

Vấn đề là JSON trả về bởi máy chủ được gói vào một mảng: [{"trường": ....}], đó là lý do tại sao xác nhận không thành công ... –

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