Jsoncpp проблемы

Я использую Jsoncpp для анализа json-форматов для С++. Я не понимаю, как это работает; для начала не хватает документации и примеров, и мне было интересно, может ли кто-нибудь дать мне несколько быстрых указателей. Единственные примеры, которые я нашел, касаются файлов...

  1. Я использую стек HTTP для получения json-сообщения в буфере. Например, буфер содержит сообщение {"state":"Running"}. Как мне использовать Json::reader для разбора этого? Опять же, единственный пример, который я нашел, связан с чтением из файлов.

  2. Как вы записываете значения в Json-сообщение? Например, я хочу написать "monkey : no" и "running : yes" в Json-сообщение, которое затем я могу использовать в своем запросе GET.

Спасибо

ОБНОВИТЬ:

на 1), например, как разобрать буфер, содержащий json-сообщение вот так:

char* buff;
uint32_t buff_size;

person KaiserJohaan    schedule 26.09.2011    source источник


Ответы (3)


Возможно, это хороший образец для первой части вашего вопроса:

Json::Value values;
Json::Reader reader;
reader.parse(input, values);

Json::Value s = values.get("state","default value");
person masoud    schedule 26.09.2011
comment
да, это то, что я ищу; Я не уверен, как использовать reader.parse() в буфере; обновленный ОП - person KaiserJohaan; 26.09.2011
comment
Я думаю, что нет проблем с использованием буфера вместо строки, но если у вас есть что-то вроде char buffer[max], вы можете использовать parse (buffer,buffer+max-1, values). - person masoud; 26.09.2011

Есть что угодно, только не отсутствие документации. Да, в основном это справочная документация, но она достаточно хороша и хорошо перелинкована.

  1. Просто прочитайте документацию
  2. Просто используйте этот класс или, возможно, использовать другой класс
person Jan Hudec    schedule 26.09.2011
comment
У меня есть, и я не до конца понимаю это, поэтому я создаю эту тему - person KaiserJohaan; 26.09.2011
comment
@KaiserJohaan: Тогда вам придется объяснить, что вы не понимаете. Метод Json::Reader::parse имеет 3 перегрузки. Один для входного потока (который может быть строковым потоком), один для строки, представленной в виде указателя на начало и указатель на завершающий NUL, и один для std::string. Классы записи имеют простой метод write, который возвращает std::string, или вы можете просто записать значение в ostream (включая stringstream), используя стандартный оператор <<. Однако вам нужно создать значение, которое также достаточно хорошо задокументировано. На главной странице даже есть образец... - person Jan Hudec; 26.09.2011
comment
Я должен согласиться с KaiserJohaan, документации этой библиотеки json очень не хватает. Кажется, что это работает хорошо, как только вы во всем разберетесь, но было трудно научиться его использовать. - person Alyoshak; 18.07.2012
comment
документы теперь обновлены. Также может быть полезна вики. Старые Readers сбивали с толку и устарели. - person cdunn2001; 14.02.2015

Пример кода для справки ниже:

файл.json

{
"B":"b_val2",
"A":{
        "AA":"aa_val1", 
        "AAA" : "aaa_val2",
        "AAAA" : "aaaa_val3"
     },
"C":"c_val3",
"D":"d_val4"
}

Сценарий использования jsoncpp, как показано ниже, для приведенного выше примера файла json.

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

using namespace std;

int main(){

Json::Value root;
Json::Reader reader;
const Json::Value defValue;         //used for default reference
std::ifstream ifile("file.json");

bool isJsonOK = ( ifile != NULL && reader.parse(ifile, root) );
if(isJsonOK){

    const Json::Value s = root.get("A",defValue);
    if(s.isObject()){

        Json::Value s2 = s.get("AAA","");
        cout << "s2 : " << s2.asString() << endl;
    }else{
        cout << "value for key \"A\" is not object type !" << endl;
    }
}
else
    cout << "json not OK !!" << endl;

return 1;

}

Вывод::

s2 : aaa_val2

Кроме того, я использовал "amalgamate.py" для создания и использования jsoncpp для исходного кода выше.

person parasrish    schedule 21.12.2015