2017-10-07 96 views
0

나는 코드가있다. 내가 알아 낸rapidjason을 사용하여 루트에서 배열을 파싱하는 방법

rapidjson/include/rapidjson/document.h:1700: int rapidjson::GenericValue<Encoding, Allocator>::GetInt() const [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>]: Assertion `data_.f.flags & kIntFlag' failed. 

한 가지 방법은 StringBuffer를을 받아 작가를 사용하는 것입니다 :이 실행할 때

Document d; 
const char* json = "[{\"k1\":\"1\"}, {\"k1\":\"2\"}]"; 
d.Parse(json); 
for (SizeType i = 0; i < d.Size(); i++) { 
    cout << d[i]["k1"].GetInt() << "\n"; 
} 

나는 오류가 아래 얻을. 배열 요소 중첩 된 문자열을 나에게 돌려 준다.

rapidjson::StringBuffer sb; 
rapidjson::Writer<rapidjson::StringBuffer> writer1(sb); 
d[0].Accept(writer1); 
std::cout << sb.GetString() << std::endl; 

위 대안의 출력은 다음과 같습니다

{"k1":"1"} 

내가 다시 구문 분석하기 위의 문자열 출력을 피드백 할 수있다. 이것을 직접 파싱 할 수있는 방법이 있습니까?

추 신 : 쉬운 인터페이스가있는 C++ 용 jason 파서가 있습니까?

+1

"1"- int로하지 않는 경우 - 이는 인 문자열은'd [i] [ "k1"]. GetString()'을 사용하여 가져와야합니다. Int는 따옴표없이 json으로 표현됩니다. json에서 "1"과 같은 문자열을 추출한 후 stoi를 사용하여 int로 변환 할 수 있습니다. –

답변

0

프로그래머는 직렬화 또는 비 직렬화하는 JSON 문자열의 형식을 알고 있어야합니다. 이 경우 문자열 값을 정수로 생각하고있는 것 같습니다.

이제 이것을 해결하기 위해 문자열로 처리 한 다음 표준 C++ 유틸리티를 사용하여 문자열 값을 정수로 변환하거나 JSON 문자열을 업데이트하여 정수를 포함 할 수 있습니다. (int로 변환이 가장 좋은 방법 가능한에서 수행되지 않는다)

첫 번째 방법 :

Document d; 
const char* json = "[{\"k1\":1}, {\"k1\":2}]"; 
d.Parse(json); 
for (SizeType i = 0; i < d.Size(); i++) { 
    int d; 
    sscanf(d[i]["k1"].GetString(), "%d", &d); 
    cout << d << "\n"; 
} 

번째 방법 :

Document d; 
const char* json = "[{\"k1\":1}, {\"k1\":2}]"; 
d.Parse(json); 
for (SizeType i = 0; i < d.Size(); i++) { 
    cout << d[i]["k1"].GetInt() << "\n"; 
}