2016-03-22 3 views
0

Я искал эту конкретную ошибку, но я не нашел никакого связанного с ней вопроса.Rapidjson не читает файл

Я пытаюсь использовать Rapidjson для разбора .json файлы в моем проекте C++, и это, как я это делаю (после каких RapidJSON tutorial состояний):

main.cpp

#include "../include/rapidjson/document.h" 
... 
using namespace rapidjson; 
int main() { 
    ... 
    Document doc; 
    doc.Parse("data/entities.json"); 

    if (doc.HasMember("DreadNought") { ... } 
    ... 
} 

Ожидаемый результат в том случае, если утверждение заключается в том, чтобы распечатать что-то на консоли Win32, но оно выдает команду Rapidjson внутри document.h.

Дело в том, что оно распознает файлы rapidjson, так как оно находит функции и не вызывает никаких ошибок. Однако, когда я отладки, это то, что doc объект содержит после выполнения Parse()

{data_={s={length=0 hashcode=0 str=0x00000000 <NULL> } ss={str=0x0124fa30 "" } n={i={i=0 padding=0x0124fa34 "" } ...} ...} } 
0x0321ec30 {chunkHead_=0x00000000 <NULL> chunk_capacity_=65536 userBuffer_=0x00000000 ...} 

Все поля внутри doc объекта имеют NULL значения. Обратите внимание, что я пробовал Parse<0>(), если я не знаю, что это означает, atm, и результат точно такой же.

Это не проблема пути, так как я использую тот же путь (data/) для получения изображений и других данных, и они найдены.

Единственная информация, которую я получаю от компилятора, - это некоторые предупреждения, которые я не смог расшифровать.

1>...\include\rapidjson\encodedstream.h(88): warning C4512: 'rapidjson::EncodedInputStream<rapidjson::UTF8<char>,rapidjson::MemoryStream>' : assignment operator could not be generated 
    ...\include\rapidjson\encodedstream.h(68) : see declaration of 'rapidjson::EncodedInputStream<rapidjson::UTF8<char>,rapidjson::MemoryStream>' 

1>...\include\rapidjson\document.h(324): warning C4512: 'rapidjson::GenericStringRef<char>' : assignment operator could not be generated 
      ...\include\rapidjson\document.h(1119) : see reference to class template instantiation 'rapidjson::GenericStringRef<char>' being compiled 
1>   ...\include\rapidjson\document.h(1118) : while compiling class template member function 'rapidjson::GenericMemberIterator<false,Encoding,Allocator> rapidjson::GenericValue<Encoding,Allocator>::FindMember(const char *)' 
1>   with 
1>   [ 
1>    Encoding=rapidjson::UTF8<char> 
1> ,   Allocator=rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> 
1>   ] 
1>   ...\include\rapidjson\document.h(1123) : see reference to function template instantiation 'rapidjson::GenericMemberIterator<false,Encoding,Allocator> rapidjson::GenericValue<Encoding,Allocator>::FindMember(const char *)' being compiled 
1>   with 
1>   [ 
1>    Encoding=rapidjson::UTF8<char> 
1> ,   Allocator=rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> 
1>   ] 
1>   ...\include\rapidjson\document.h(2010) : see reference to class template instantiation 'rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>' being compiled 
1>   ...\src\main.cpp(17) : see reference to class template instantiation 'rapidjson::GenericDocument<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>,rapidjson::CrtAllocator>' being compiled 

То, что я думаю, что это происходит чтение этих предупреждений в том, что она не принимает const char *, но это, как это делается в учебнике я связан, и они не показывают какой-либо другой путь.

Заранее спасибо.

UPDATE:

Кажется, что это может быть проблема с файлом, но я не уверен, что и не знаю, как избежать этого. Я создал файл с кодом Visual Studio и сохранил его как .json, и я создал его как .txt из проводника Windows, тот же результат. Я также скачал его из JSON Editor Online, и он не работает, так что я почти уверен, что есть еще одна проблема, которую я не могу получить ...

ответ

1

В API Document::Parse(const char* json) параметр json представляет собой строку, содержащую JSON , а не имя файла.

Вы можете

  1. загрузить файл JSON в строку самостоятельно, а затем вызвать Parse(); или
  2. ParseStream() with FileReadStream which wraps FILE*; или
  3. использование ParseStream() with IStreamWrapper which wraps ifstream.

Для больших файлов JSON, 2 и 3 имеют преимущество при уменьшении использования памяти.

+0

Изобразительное. Спасибо, я этого не заметил. – jjimenezg93

Смежные вопросы