десериализовать json внутри json в arduino

#json #arduino

#json #arduino

Вопрос:

Мой arduino получает через TCP json, который выглядит следующим образом:

 {"Order":9,"SenderID":"Master","Params":{"newSolution":"35"}}
 

Я анализирую его, используя #include <ArduinoJson.h> вот так:

 void Connectivity::ProcessNewMessage(char* topic, byte* payload, unsigned int length)
{
    StaticJsonDocument<80> doc;
    DeserializationError err = deserializeJson(doc, payload);
    if (err) {
        Serial.print(F("deserializeJson() failed with code "));
        Serial.println(err.c_str());
    }
    else
    {
        //we get the Order, or 99 if Order is not set. JsonDeserializer never makes exceptions
        //So the only way to know something was wrong is provide unexpected values as Order 99
        int Order = doc["Order"] | 99;
        switch(Order)
        {
            case 9:
            {
               //here I need to access the new solution that is 
               //in the Params.

                const char* serializedParams = (const char*) doc["Params"];
                Serial.println("testing 1:");
                Serial.println(serializedParams);
                Serial.println("    1");
                DeserializationError err = deserializeJson(doc, serializedParams);
                if (err) {
                    Serial.print(F("deserializeJson() failed with code "));
                    Serial.println(err.c_str());
                }
                else
                {
                   //here the code when everything works
                }
             }
         }

 

Это результат, который я получаю при запуске:

 ---
internal: Message arrived [master/Arduino] 
{"Order":9,"SenderID":"Master","Params":{"newSolution":"35"}}
testing 1:

    1
deserializeJson() failed with code IncompleteInput`
 

Как вы можете видеть, параметры НАХОДЯТСЯ во входящем json, но при попытке получить к нему доступ он пуст. Есть идеи?? Я опытный программист на C #, но C и весь беспорядок с символами char * const для меня очень стар .. 🙂

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

1. Вы уверены, что вам нужно звонить deserializeJson дважды?

2. не уверен.. но это имело бы смысл. Это сообщение также анализируется другими устройствами, закодированными в micropython, и там мне нужно было также проанализировать содержимое. Но моя главная проблема в том, что serializedParams пуст

Ответ №1:

Проблема заключалась в том, как я обращался к serializedParams. Это решение работает:

 //incoming string is : {"Order":9,"SenderID":"Master","Params":{"newSolution":"35"}}

    StaticJsonDocument<80> doc;
    DeserializationError err = deserializeJson(doc, payload);
    if (err) {
        Serial.print(F("deserializeJson() failed with code "));
        Serial.println(err.c_str());
    }
    else
    {
         const char* Params_newSolution = doc["Params"]["newSolution"];
         // Params_newsOlution contains = "35"
         float alreadyParsed = doc["Params"]["newSolution"];
         // alreadyParsed contains 35.0
    }