2012-04-06 22 views
10
{"hi": "hellow", 
"first": 
    {"next":[ 
      {"key":"important_value"} 
     ] 
    } 

} 

Truy cập RapidJSON bên mảng:thư viện RapidJSON nhận được một giá trị bên trong một mảng bởi chỉ số của nó

công trình này: cout << "HI VALUE:" << variable["hi"].GetString() << endl; chí đầu ra này: hellow như mong đợi, vấn đề là để truy cập vào các giá trị bên trong như thế nào nếu tôi muốn nhận được "Important_Value", tôi đã thử một cái gì đó như thế này: cout << "Key VALUE:" << variable["first"]["next"][0]["key"].GetString() << endl ; nhưng điều này không làm việc, tôi muốn để có thể nhận được "important_value" bởi mục đầu tiên của mảng, và trong trường hợp này nó là [0] gây ra lỗi.

Làm cách nào để thực hiện theo chỉ mục của nó? Tôi hy vọng nó rõ ràng giải thích của tôi.

Xin cảm ơn trước.

Trả lời

20

JSON

{"hi": "hellow", "first": {"next":[{"key":"important_value"} ] } } 

Code:

rapidjson::Document document;  

if (document.Parse<0>(json).HasParseError() == false) 
{ 
    const Value& a = document["first"]; 

    const Value& b = a["next"]; 

    // rapidjson uses SizeType instead of size_t. 
    for (rapidjson::SizeType i = 0; i < b.Size(); i++) 
    { 
     const Value& c = b[i]; 

     printf("%s \n",c["key"].GetString()); 
    }   
} 

Sẽ in important_value

+1

điều này không trả lời bất kỳ điều gì, làm ví dụ trong ví dụ của tôi với dấu ngoặc vuông [], dấu ngoặc là vấn đề vì đó là vị trí tự động của mảng, giá trị đầu tiên là 0, tiếp theo là 1 và cứ thế .. những gì bạn đã làm, tôi đã có, cố gắng để có được giá trị như trong ví dụ của tôi, sử dụng cùng một nguồn. – Grego

+0

Hãy thử điều này ........ – mola10

+0

Đây chính xác là những gì tôi đang tìm cách truy cập đối tượng lồng nhau trong thành viên mảng. +1 – haxpor

2

Tôi nhận thấy điều này trong file tutorial.cpp;

// Note: 
//int x = a[0].GetInt();   // Error: operator[ is ambiguous, as 0 also mean a null pointer of const char* type. 
int y = a[SizeType(0)].GetInt(); // Cast to SizeType will work. 
int z = a[0u].GetInt();   // This works too. 

Tôi chưa thử nghiệm nhưng bạn có thể muốn thử một trong các cách này;

biến [ "đầu tiên"] [ "bên cạnh"] [0u] [ "key"]. GetString()

biến [ "đầu tiên"] [ "bên cạnh"] [SizeType (0)] [" key "]. GetString()

13

[cập nhật]

Bằng cách làm việc thông minh của những người đóng góp, RapidJSON bây giờ có thể disambiguate đen 0 từ chuỗi. Vì vậy, vấn đề không còn xảy ra nữa.

https://github.com/miloyip/rapidjson/issues/167


Vấn đề, như mjean chỉ ra, trình biên dịch không thể xác định liệu có nên gọi accessor thành viên đối tượng hoặc các accessor phần tử mảng, bởi literial 0:

GenericValue& operator[](const Ch* name) 
GenericValue& operator[](SizeType index) 

Sử dụng [0u] hoặc [SizeType(0)] có thể giải quyết vấn đề này.

Một cách khác để đối phó với vấn đề này là ngừng sử dụng phiên bản quá tải cho toán tử []. Ví dụ: sử dụng operator() cho một loại quyền truy cập. Hoặc sử dụng các chức năng bình thường, ví dụ: GetMember(), GetElement(). Nhưng tôi không có sở thích về điều này ngay bây giờ. Các đề xuất khác được hoan nghênh.

0

Nếu bạn muốn truy cập nó với dấu ngoặc, sau đó bạn có thể sử dụng như sau:

int i=0; 
cout<<"Key VALUE:"<<variable["first"]["next"][i]["key"].GetString()<<endl ; 

Output: GIÁ TRỊ chính: important_value

Nó làm việc cho tôi.

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