2017-03-17 14 views
0

현재 사용중인 JSON serializer 클래스가 있습니다. 그것은 내가 연구하고있는 실험적인 코드를위한 것입니다. 이 코드는 cpprestsdk를 사용하고 있습니다. 직렬화는 rapidjson 또는 cpprestsdk의 json을 사용하도록 설정됩니다. 나는 아무 문제 JSON 변환 할 수 없습니다문자열로 변환 할 때 rapidjson 결과가 일치하지 않습니다.

virtual void toJson(rapidjson::Document& json) const =0; 
virtual void toJson(web::json::value& json) const =0; 

virtual void fromJson(const rapidjson::Value& json) =0; 
virtual void fromJson(const web::json::value& json) =0; 

: 같은

그래서 예를 들어, 클래스의 가상 함수를 찾습니다. 저는 현재 클래스 객체를 JSON으로 변환 한 다음이를 파일로 문자열로 내보내고 있습니다. rapidjson을 사용하면 결과가 달라진다는 것을 알았습니다. 을 변경하지, 이것은 연속 실행을위한

"base": { 
     "name": "base", 

:이 같은 조각을보고, 다른 실행에

"base": { 
     "name\u0000refere": "base", 

:

는 일부 수출에, 나는 이런 조각을 볼 수 코드.

이 필드는 실제로 세계적과 같이 const char *을 정의됩니다 kObjectKeyNameconst char *kObjectKeyName = "name";으로 정의된다

void Object::toJson(rapidjson::Document& json) const { 
    using namespace rapidjson; 

    json.SetObject(); // Reset and clear any existing 

    auto& allocator = json.GetAllocator(); 

    json.AddMember(StringRef(kObjectKeyName), Value(name.c_str(), allocator), allocator); 
    json.AddMember(StringRef(kObjectKeyPrioritizeTable), Value(prioritizeTable), allocator); 
    json.AddMember(StringRef(kObjectKeyPrioritizeGreaterOn), Value(prioritizeGreaterOn), allocator); 
} 

하는 것으로 :

const char *kSymbolKeyName = "name"; 
const char *kSymbolKeyReferenceName = "referenceName"; 

문제가있는 JSON 객체를 생성하는 코드는 것 같습니다.

그리고이 클래스의 toJson의 모습에 발신자 : 나는 rapidjson::Document의 및 할당자를 사용하고있는 방법에서 줄기 수있는 문제의

using namespace rapidjson; 

json.SetObject(); // Reset and clear any existing 

auto& allocator = json.GetAllocator(); 

for (const auto& it : tables) { 
    Document iJson; 
    it.second->toJson(iJson); 
    json.AddMember(Value(it.first.c_str(), allocator), iJson, allocator); 
} 

부. 나는 내가 SetObject 전화를 걸면 toJson 호출이 자신의 할당 자라고 끝낼 것이라고 믿습니다.

내 계획은 Document 대신 ValuetoJson에 사용하도록 코드를 수정 한 다음 할당자를 인수로 전달하는 것입니다. 저는 게으르다가 서명을 원했기 때문에 rapidjson이나 cppsrestsdk의 아들을 뒤집기가 쉽기 때문에 주로 그렇게하고 싶지 않았습니다.

오, 그래, 문자열로 출력 코드 파일은 다음

 std::ofstream out("output.json"); 
     rapidjson::Document outDoc; 

     dataSet.toJson(outDoc); 

     rapidjson::StringBuffer buffer; 

     buffer.Clear(); 

     rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer); 
     outDoc.Accept(writer); 
     out << buffer.GetString(); 

     out.close(); 

최근 rapidjson을 사용하기 시작 나는 바보/홀수하고있는 중이 야 의심의 여지가 뭔가가 없습니다. 나는 내 문제를 좁히고 내 방식의 오류를 더 잘 이해하려고 노력하고있다.

답변

0

할당자가 전달할 프로세스를 수정하면 나타납니다.

나는, 모든 기본 Document의 할당을 사용합니다, 필요할 때, Value의 생성을 의미 내 사용에

rapidjson::Value toJson(rapidjson::Document::AllocatorType& allocator); 

될 내 toJson 기능을 수정했습니다.