首页 > 解决方案 > 在arduino中反序列化json中的json

问题描述

我的 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 中看到的 Params IS 但在尝试访问它时,它是空的。有任何想法吗 ??我是一位经验丰富的 C# 编码器,但 C++ 和所有 char char* const char mess 对我来说已经很老了.. :)

标签: jsonarduino

解决方案


问题是我访问 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
    }

推荐阅读