как создать объект json на c с помощью Jansson

#c #json

#c #json

Вопрос:

Я новичок в MQTT и хочу отправить сообщение с помощью клиентской библиотеки paho c, я могу отправить сообщение в виде символа *, но мне нужно преобразовать его в формат JSON.

Я нашел Янссон из json.org чтобы создать объект JSON для отправки в виде сообщения MQTT.

вот что я пробовал:

 #include <stdio.h>
#include <jansson.h>

int main(int argc, char* argv[])
{
    // .....  creating client ....

    //creating JSON
    long int timestamp = 1609446771;
    float temperature = 30.14;
    float D850 = 102.48;
    float D280 = 4845.84;
    
    json_t *obj = json_pack("{s:s,s:s,s:s,s:s}",
                            "timestamp", timestamp,
                            "temperature", temperature,
                            "D850", D850,
                            "D280", D280);

    // .... publishing message ....    
}
 

Я скомпилировал код с:

gcc -L/home/MYUSER/MQTT/paho.mqtt.c/build/output pahocclient.c -lpaho-mqtt3c -ljansson -lm -o publish_c.out

код компилируется без ошибок, но когда я запускаю его, я получаю ошибку ошибки сегментации:

Ошибка сегментации (сброс ядра)

что я делаю не так?

Комментарии:

1. Попробуйте добавить NULL последний аргумент json_pack и скомпилировать как ваш код на C, так и библиотеку JANSSON с помощью gcc -Wall -Wextra -g

2. вы имеете в виду json_t *obj = json_pack("{s:s,s:s,s:s,s:s}", "timestamp", timestamp, "temperature", temperature, "D850", D850, "D280", D280, NULL); и компилируете с помощью: gcc -L/home/shahriar/MQTT/paho.mqtt.c/build/output pahocclient.c -lpaho-mqtt3c -ljansson -lm -Wall -Wextra -g -o publish_c.out ?? Я все еще получаю Segmentation fault (core dumped) ошибку

3. Я в основном имею в виду, что вам следует уделять больше времени чтению документации библиотек, которые вы используете

Ответ №1:

Сначала вам нужно потратить больше времени на ознакомление с форматом JSON.

Затем ваш

 json_t *obj = json_pack("{s:s,s:s,s:s,s:s}",
                        "timestamp", timestamp,
                        "temperature", temperature,
                        "D850", D850,
                        "D280", D280);
 

плохо типизирован. Поскольку вы используете s everywhere в первом аргументе, вы должны передавать строки C везде.

Например:

 long int timestamp = 1609446771;
char timestampbuf [64];
memset(timestampbuf, 0, sizeof(timestampbuf));
snprintf (timestampbuf, sizeof(timestampbuf), "%ld", timestamp);
 

затем перейдите "timestamp", timestampbuf, к json_pack .

В качестве альтернативы, потратьте больше времени на чтение документации libjansson. Может быть, вам следует изменить "{s:s,s:s,s:s,s:s}" строку и изменить спецификацию данных JSON?

Вы могли бы даже подумать о написании своего плагина GCC, чтобы проверять во время компиляции ввод большинства json_pack вызовов. См. Статический анализатор bismon.

Если вы компилируете с помощью GCC, обязательно ознакомьтесь с его документацией и запустите ее со всеми предупреждениями и отладочной информацией: gcc -Wall -Wextra -g . Затем используйте отладчик GDB.

Вы также можете скомпилировать jansson из его исходного кода с аналогичными параметрами компиляции (или gcc -Wall -Wextra -g -O2 )

Перед написанием кода задокументируйте на письменном английском языке (или на обычном человеческом языке), с обозначением EBNF, JSON, который вы хотите отправить, и отправьте этот документ (возможно, по электронной почте) лицу, пишущему на принимающей стороне.