ArduinoJson converter String em Array

Eu estou tentando converter o JSON abaixo. O campo "data":"----", que está em formato String no JSON em um Array.

{
  "id": "xxxx",
  "cmdname": "xxxx",
  "cmd": "ir",
  "deviceId": "xxxxx",
  "data": "[3398,1700,426,1277,477,403,425,434,450,431,425,432,451,432,422,438,449,428,421,438,450,428,423,437,448,432,401,1298,456,428,427,428,451,432,429,427,451,432,429,426,447,435,428,428,445,437,430,431,365,518,425,432,419,441,448,429,421,453,470,408,421,435,450,1271,425,435,450,1271,424,1278,452,1270,425,1275,452,1287,424,1280,448,427,366,1337,447,1272,394,1309,450,1269,425,1277,452,1271,404,1296,453,1271,422,1292,448,430,422,438,449,429,423,437,449,430,422,437,449,430,424,434,450,431,424,429,475,1251,430,1269,453,432,429,427,448,1276,431,1268,369,1336,448,1268,421,444,446,429,419,1284,450,1269,423,440,448,430,422,438,450,1265,434,426,448,433,428,1270,445,438,430,426,445,1280,431,1270,419,465,428,1267,370,1338,448,425,367,1338,449,1269,371,494,448,431,417,467,454,1238,420,467,427,429,367,496,446,1271,395,469,448,1267,423,1280,449,430,421,1281,450,1271,423,1280,451,431,422,1286,451,425,424,434,478,404,451,1245,421,461,431,1265,369,1336,449,428,366,1338,447,1271,420,1285,449,430,421,1281,449,431,420,440,447,1274,425,438,447,432,422,435,450,430,423,435,450,431,401,455,453,429,430,1268,453,1272,431,1268,449,1276,430,1269,447,1278,429,1268,450,1275,431,428,445,437,427,429,443,440,427,428,367,517,425,429,368,516,425,1268,421,1280,451,1269,422,1284,448,1270,424,1281,449,1273,424,1281,451,432,417,442,448,429,418,466,424,458,371,485,424,458,396,461,427,1266,459,1238,420,1306,433,1263,420,1288,477,1242,484,1299,491,1258,488,422,370,487,462,419,374,482,460,426,415,445,463,419,459,426,436,1263,421,1277,467,1252,370,1332,469,1255,372,1336,490,1232,416,1282,499,384,413,442,498,383,388,469,495,384,389,468,496,387,386,468,495,1229,388,1312,497,1202,395,1307,520,1201,395,1305,520,1203,499,1199,523,1202,500,1199,519,366,495,386,497,390,471,385,496,1200,498,387,494,389,470,386,491,1204,500,1199,480,1251,497,1200,441,446,495,1197,416,1291,517,386,385,471,493,389,374,1301,518,390,403,1269,519,1204,499,386,491,1204,503,1198,519,1203,497,389,491,1206,467,418,486,397,462,394,454,401,490,394,448,407,463,429,463,421,433,422,462,421,436,1233,487,1238,467,1231,485,1240,472,1224,446,1280,463,1235,416,1291,477,426,383,472,457,427,337,521,456,427,370,484,455,429,400,430,480,1233,463,1238,480,1245,460,1246,451,1273,462,1238,418,1309,459,1236,397,10000]",
  "sendType": "ir",
  "ip": "",
  "port": "",
  "delay": 0
}

Eu já tentei algumas conversões, como as abaixo. Mas o resultado é um vetor vazio ou null.

Retorno []

JsonVariant varJson = jsonDoc["data"];
JsonArray arrayJson = varJson.to<JsonArray>();

Retorno null

String strArray = jsonDoc["data"];
JsonArray createArray = docArray.createNestedArray(strArray);

O seu "json" está errado.
na segunda linha está escrito ... "id": "xxxx,
mas deveria ser ... "id": "xxxx",

Corrija e veja se funciona.

Veja o resultado depois de corrigido em um editor json.

image

O seu "data" é muito grande para um arduino UNO ou Mega.

Qual arduino vc está usando?

Veja aqui uma simulação com um Mega,
Consegui no máximo 440 valores do "data" .

" TestJson - Wokwi ESP32, STM32, Arduino Simulator

Está errado apenas porque eu estava removendo alguns dados sensíveis. Mas o JSON original está correto, o ponto principal é o data.

Eu estou utilizando ESP8266 e ESP32. Então ele tem memória o suficiente para isso.

A questão mesmo é a conversão.
Nao detalhei, mas esses dados são pulsos em milissegundos de um controle infravermelho que será executado na biblioteca:

Eu consegui fazer a conversão. Gostaria de compartilhar o resultado.

#include <Arduino.h>
#include <ArduinoJson.h>

static const char constString[] PROGMEM =
  R"=====({"id": "app_e08f0c45",
  "cmdname": "POWER_ON",
  "cmd": "ir",
  "deviceId": "XX:XX:XX:XX:XX:XX",
  "data": "[3398,1700,426,1277,477,403,425,434,450,431,425,432,451,432,422,438,449,428,421,438,450,428,423,437,448,432,401,1298,456,428,427,428,451,432,429,427,451,432,429,426,447,435,428,428,445,437,430,431,365,518,425,432,419,441,448,429,421,453,470,408,421,435,450,1271,425,435,450,1271,424,1278,452,1270,425,1275,452,1287,424,1280,448,427,366,1337,447,1272,394,1309,450,1269,425,1277,452,1271,404,1296,453,1271,422,1292,448,430,422,438,449,429,423,437,449,430,422,437,449,430,424,434,450,431,424,429,475,1251,430,1269,453,432,429,427,448,1276,431,1268,369,1336,448,1268,421,444,446,429,419,1284,450,1269,423,440,448,430,422,438,450,1265,434,426,448,433,428,1270,445,438,430,426,445,1280,431,1270,419,465,428,1267,370,1338,448,425,367,1338,449,1269,371,494,448,431,417,467,454,1238,420,467,427,429,367,496,446,1271,395,469,448,1267,423,1280,449,430,421,1281,450,1271,423,1280,451,431,422,1286,451,425,424,434,478,404,451,1245,421,461,431,1265,369,1336,449,428,366,1338,447,1271,420,1285,449,430,421,1281,449,431,420,440,447,1274,425,438,447,432,422,435,450,430,423,435,450,431,401,455,453,429,430,1268,453,1272,431,1268,449,1276,430,1269,447,1278,429,1268,450,1275,431,428,445,437,427,429,443,440,427,428,367,517,425,429,368,516,425,1268,421,1280,451,1269,422,1284,448,1270,424,1281,449,1273,424,1281,451,432,417,442,448,429,418,466,424,458,371,485,424,458,396,461,427,1266,459,1238,420,1306,433,1263,420,1288,477,1242,484,1299,491,1258,488,422,370,487,462,419,374,482,460,426,415,445,463,419,459,426,436,1263,421,1277,467,1252,370,1332,469,1255,372,1336,490,1232,416,1282,499,384,413,442,498,383,388,469,495,384,389,468,496,387,386,468,495,1229,388,1312,497,1202,395,1307,520,1201,395,1305,520,1203,499,1199,523,1202,500,1199,519,366,495,386,497,390,471,385,496,1200,498,387,494,389,470,386,491,1204,500,1199,480,1251,497,1200,441,446,495,1197,416,1291,517,386,385,471,493,389,374,1301,518,390,403,1269,519,1204,499,386,491,1204,503,1198,519,1203,497,389,491,1206,467,418,486,397,462,394,454,401,490,394,448,407,463,429,463,421,433,422,462,421,436,1233,487,1238,467,1231,485,1240,472,1224,446,1280,463,1235,416,1291,477,426,383,472,457,427,337,521,456,427,370,484,455,429,400,430,480,1233,463,1238,480,1245,460,1246,451,1273,462,1238,418,1309,459,1236,397,10000]",
  "sendType": "ir",
  "ip": "",
  "port": "",
  "delay": 0})=====";

void setup(void)
{
  Serial.begin(115200);

  // Carrega os dados da flash, apenas para exemplo, pode vir de qualquer outro lugar
  DynamicJsonDocument jsonDoc(3072);
  deserializeJson(jsonDoc, FPSTR(constString));

  // Copia os dados do json no campo "data" para uma String
  String strArray = jsonDoc["data"];

  // Cria um documento para deserializacao da string
  DynamicJsonDocument docArray(8533);
  deserializeJson(docArray, strArray.c_str());

  // Converte em JsonArray, mas pode ser trabalho diretamente com o DynamicJsonDocument
  // Verificar documentacao https://arduinojson.org/v6/api/jsonarray/
  JsonArray arrayJson = docArray.as<JsonArray>();
  serializeJsonPretty(arrayJson, Serial);
  Serial.println();
}

void loop(void)
{

}

Para quem precisar converter gastando mais processamento e menos memória pode também utilizar essa solução:

#include <Arduino.h>
#include <ArduinoJson.h>

uint16_t signal_data[1024] = {NULL};

static const char constString[] PROGMEM =
  R"=====({"id": "app_e08f0c45",
  "cmdname": "POWER_ON",
  "cmd": "ir",
  "deviceId": "XX:XX:XX:XX:XX:XX",
  "data": "[3398,1700,426,1277,477,403,425,434,450,431,425,432,451,432,422,438,449,428,421,438,450,428,423,437,448,432,401,1298,456,428,427,428,451,432,429,427,451,432,429,426,447,435,428,428,445,437,430,431,365,518,425,432,419,441,448,429,421,453,470,408,421,435,450,1271,425,435,450,1271,424,1278,452,1270,425,1275,452,1287,424,1280,448,427,366,1337,447,1272,394,1309,450,1269,425,1277,452,1271,404,1296,453,1271,422,1292,448,430,422,438,449,429,423,437,449,430,422,437,449,430,424,434,450,431,424,429,475,1251,430,1269,453,432,429,427,448,1276,431,1268,369,1336,448,1268,421,444,446,429,419,1284,450,1269,423,440,448,430,422,438,450,1265,434,426,448,433,428,1270,445,438,430,426,445,1280,431,1270,419,465,428,1267,370,1338,448,425,367,1338,449,1269,371,494,448,431,417,467,454,1238,420,467,427,429,367,496,446,1271,395,469,448,1267,423,1280,449,430,421,1281,450,1271,423,1280,451,431,422,1286,451,425,424,434,478,404,451,1245,421,461,431,1265,369,1336,449,428,366,1338,447,1271,420,1285,449,430,421,1281,449,431,420,440,447,1274,425,438,447,432,422,435,450,430,423,435,450,431,401,455,453,429,430,1268,453,1272,431,1268,449,1276,430,1269,447,1278,429,1268,450,1275,431,428,445,437,427,429,443,440,427,428,367,517,425,429,368,516,425,1268,421,1280,451,1269,422,1284,448,1270,424,1281,449,1273,424,1281,451,432,417,442,448,429,418,466,424,458,371,485,424,458,396,461,427,1266,459,1238,420,1306,433,1263,420,1288,477,1242,484,1299,491,1258,488,422,370,487,462,419,374,482,460,426,415,445,463,419,459,426,436,1263,421,1277,467,1252,370,1332,469,1255,372,1336,490,1232,416,1282,499,384,413,442,498,383,388,469,495,384,389,468,496,387,386,468,495,1229,388,1312,497,1202,395,1307,520,1201,395,1305,520,1203,499,1199,523,1202,500,1199,519,366,495,386,497,390,471,385,496,1200,498,387,494,389,470,386,491,1204,500,1199,480,1251,497,1200,441,446,495,1197,416,1291,517,386,385,471,493,389,374,1301,518,390,403,1269,519,1204,499,386,491,1204,503,1198,519,1203,497,389,491,1206,467,418,486,397,462,394,454,401,490,394,448,407,463,429,463,421,433,422,462,421,436,1233,487,1238,467,1231,485,1240,472,1224,446,1280,463,1235,416,1291,477,426,383,472,457,427,337,521,456,427,370,484,455,429,400,430,480,1233,463,1238,480,1245,460,1246,451,1273,462,1238,418,1309,459,1236,397,10000]",
  "sendType": "ir",
  "ip": "",
  "port": "",
  "delay": 0})=====";

void setup(void)
{
  Serial.begin(115200);
  DynamicJsonDocument jsonDoc(3072);
  deserializeJson(jsonDoc, FPSTR(constString));

  JsonVariant data = jsonDoc["data"];

  if (data.is<String>() == true)
  {
    String configProtocol = data.as<String>();

    // Remove o vetor do jsonDoc para separar os valores com virgula
    if (configProtocol.startsWith("[") == true)
    {
      configProtocol = configProtocol.substring(1, configProtocol.length() - 1);
      Serial.printf("dataProtocol [%d]: %s\n", configProtocol.length(), configProtocol.c_str());

      uint16_t fromData = NULL;
      uint16_t indexConfig = NULL;
      uint16_t sizeDataProtocol = configProtocol.length();
      // Separa os valores com virgula
      do
      {
        uint16_t fromIndex = configProtocol.indexOf(",", fromData + 1);

        if (fromData == NULL)
        {
          signal_data[indexConfig] = configProtocol.substring(fromData, fromIndex + 1).toInt();
        }
        else
        {
          signal_data[indexConfig] = configProtocol.substring(fromData + 1, fromIndex).toInt();
        }

        Serial.printf("Data [%d]> %d\n", indexConfig, signal_data[indexConfig]);
        fromData = fromIndex;
        indexConfig++;
      } while (fromData < sizeDataProtocol);
    }
  }
}

void loop(void)
{

}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.