Почему библиотека JsonCpp успешно анализирует строку, берет строку при сбое программы?

Я обнаружил, что использование библиотеки JsonCpp, проанализированной строки json A, не может быть разрешено, странно то, что анализ строки B разрешается успешно, когда я беру содержимое строки при сбое программы, вот почему? Как избежать сбоя?(строка A:"http://192.168.1.1";строка B:"192.168 .1.1";)

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

int main(int argc, char** argv)
{
    //compile:g++ -o test json_value.cpp json_writer.cpp json_reader.cpp json_test.cpp -I./include
    Json::Value root;   // will contains the root value after parsing.
    Json::Reader reader;
    bool parsingSuccessful = reader.parse( "192.168.1.1", root );//http://192.168.1.1
    if ( !parsingSuccessful )
    {
        // report to the user the failure and their locations in the document.
        std::cout  << "Failed to parse configuration\n"
                   << reader.getFormattedErrorMessages();
        return 0;
    }
    else
    {
        std::cout << "Successfully parse configuration" << endl;
    }

    // Get the value of the member of root named 'encoding', return 'UTF-8' if there is no
    // such member.
    std::string encoding = root.get("encoding", "UTF-8" ).asString();


    // And you can write to a stream, using the StyledWriter automatically.
    std::cout << "encoding:" <<encoding << endl;

    return 0;
}

person crazy    schedule 20.07.2017    source источник


Ответы (1)


Какой JSON вы ожидаете, что строки будут содержаться?

Помните, что JSON.parse принимает строку, содержащую допустимое значение JSON. Ни одна из упомянутых вами строк не является допустимым значением JSON ("192.168.1.1" и "http://192.168.1.1"), возможно, jsoncpp принимает "192.168.1.1" как число, игнорируя часть .1.1 (если это так, это ошибка).

Если вы ожидаете строку, вы должны указать ее дважды (один раз для C++ и один раз для JSON).

bool parsingSuccessful = reader.parse("\"http://192.168.1.1\"", root);

В этом примере первые (неэкранированные) двойные кавычки (") сообщают C++, что это строка, а экранированные двойные кавычки (\") позволяют jsoncpp анализировать строковую переменную.

Если ваш компилятор поддерживает необработанные строковые литералы вы можете избежать экранирования кавычек.

bool parsingSuccessful = reader.parse(R"("http://192.168.1.1")", root);

Другой пример:

bool parsingSuccessful = reader.parse(R("{"a": 42, "b": "hi"})", root);
person Motti    schedule 12.09.2017
comment
Мне нужно прочитать строку из файла конфигурации, как я могу убедиться, что строка является допустимым значением JSON. - person crazy; 16.11.2017
comment
@ user7079007 оберните его в блок try и catch в исключение, если он недействителен. - person Motti; 16.11.2017