2010-11-25 5 views
11

Так что я недавно установил JSONCPP и по какой-то причине это дает мне ошибки, когда я пытаюсь этот код:JSONCPP не читает файлы правильно

#include <json.h> 
#include <iostream> 
#include <fstream> 

int main(){ 
    bool alive = true; 
    while (alive){ 
    Json::Value root; // will contains the root value after parsing. 
    Json::Reader reader; 
    std::string test = "testis.json"; 
    bool parsingSuccessful = reader.parse(test, root, false); 
    if (!parsingSuccessful) 
    { 
     // report to the user the failure and their locations in the document. 
     std::cout << reader.getFormatedErrorMessages() 
       << "\n"; 
    } 

    std::string encoding = root.get("encoding", "UTF-8").asString(); 
    std::cout << encoding << "\n"; 
    alive = false; 


    } 
    return 0; 
} 

А вот файл:

{ 
"encoding" : "lab" 
} 

Он говорит, что в строке 1, столбце 1 есть синтаксическая ошибка и что должно быть значение, объект или массив. Кто-нибудь знает, как это исправить?

EDIT: Изменен текущий код, от Pastebin

+2

Для форматирования кода, выделите ее и нажмите CTRL + K. Используйте предварительный просмотр. – EboMike 2010-11-25 01:36:56

+0

Downvote - это потому, что просто _прочитайте документацию_ вместо случайного угадывания аргументов функции, и все будет в порядке. – 2015-02-14 19:38:08

+1

@LightnessRacesinOrbit Фактически, документация для этого аргумента читает _ «кодированную строку UTF-8, содержащую прочитанный документ». _, Которая по меньшей мере немного неоднозначна, поскольку можно было бы сделать вывод из используемого слова «документ», что std :: запрошенная строка действительно должна быть файловым путем. Фактически, я просто сделал ту же ошибку, что и ОП. – Tom 2016-01-13 12:53:48

ответ

26

Смотрите документацию Json::Reader::parse. Для этой перегрузки строка должна быть фактическим документом, а не именем файла.

Вместо этого вы можете использовать istream overload с ifstream.

std::ifstream test("testis.json", std::ifstream::binary); 

EDIT: Я получил это работает с:

#include "json/json.h" 
#include <iostream> 
#include <fstream> 

int main(){ 
    bool alive = true; 
    while (alive){ 
    Json::Value root; // will contains the root value after parsing. 
    Json::Reader reader; 
    std::ifstream test("testis.json", std::ifstream::binary); 
    bool parsingSuccessful = reader.parse(test, root, false); 
    if (!parsingSuccessful) 
    { 
     // report to the user the failure and their locations in the document. 
     std::cout << reader.getFormatedErrorMessages() 
       << "\n"; 
    } 

    std::string encoding = root.get("encoding", "UTF-8").asString(); 
    std::cout << encoding << "\n"; 
    alive = false; 
    } 
    return 0; 
} 
-12

JSON не может содержать символы перевода строки. Попробуйте это вместо:

{"encoding": "lab"} 

Возможно, вам потребуется убедиться, что файл сохранен без окончательной новой строки.

EDIT: Возможно, ваш синтаксический анализатор переносит символы новой строки, а некоторые нет. Что-то, чтобы попробовать, если другие ответы не работают

0
#include "json/json.h" 
#include <iostream> 
#include <fstream> 

int main(){ 
    Json::Value root; // will contain the root value after parsing. 
    std::ifstream stream("testis.json", std::ifstream::binary); 
    stream >> root; 
    std::string encoding = root.get("encoding", "UTF-8").asString(); 
    std::cout << encoding << "\n"; 
    return 0; 
} 

Или в более общем плане:

#include "json/json.h" 
#include <iostream> 
#include <fstream> 

int main(){ 
    Json::Value root; // will contain the root value after parsing. 
    Json::CharReaderBuilder builder; 
    std::ifstream test("testis.json", std::ifstream::binary); 
    std::string errs; 
    bool ok = Json::parseFromStream(builder, test, &root, &errs); 
    if (!ok) 
    { 
     // report to the user the failure and their locations in the document. 
     std::cout << errs << "\n"; 
    } 

    std::string encoding = root.get("encoding", "UTF-8").asString(); 
    std::cout << encoding << "\n"; 
    return 0; 
} 

http://open-source-parsers.github.io/jsoncpp-docs/doxygen/namespace_json.html

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