Parsing large jason response from the server, Exception 9

Hi,
i am new to Arduino forum and i was hoping you guys could help me, i am working on a greenhouse monitoring and controlling system using Nodemcu (esp8266-12E , so am trying to parse a large response from the server using Arduinojason Assistant, i am using sim800l call the GET API and therefore using a char a [256] to store the response which is read using AT+HTTPREAD , then use the char a above as the input of the jason deserializer , when the program reaches this step it crashes with the exception 9 stack error

|Data structures 912 Bytes needed to stores the JSON objects and arrays in memory

Strings 247 Bytes needed to stores the strings in memory |
Filter 18 The parser temporarily stores some ignored keys; this is the size of the largest one.
Total (minimum) 1177 Minimum capacity for the JsonDocument.
Total (recommended) 1536 Including some slack in case the strings change, and rounded to a power of two

mySerial.println("AT+HTTPREAD");
  while(mySerial.read() != 'K') {
        a[i]= mySerial.read();
        i++;
      }
// Stream& input;

StaticJsonDocument<912> filter;

JsonObject filter_data_0 = filter["data"].createNestedObject();
filter_data_0["title"] = "mesh";
filter_data_0["greenhouse_serial"] = "12345";

JsonArray filter_data_0_modules = filter_data_0.createNestedArray("modules");

JsonObject filter_data_0_modules_0 = filter_data_0_modules.createNestedObject();
filter_data_0_modules_0["title"] = "heater";
filter_data_0_modules_0["slug"] = true;
filter_data_0_modules_0["type"] = "controller";
filter_data_0_modules_0["min"] = true;
filter_data_0_modules_0["max"] = true;
filter_data_0_modules_0["func"] = "on";

JsonObject filter_data_0_modules_1 = filter_data_0_modules.createNestedObject();
filter_data_0_modules_1["title"] = "air-conditioner-(cold)";
filter_data_0_modules_1["slug"] = "air-conditioner-(cold)";
filter_data_0_modules_1["type"] = "controller";
filter_data_0_modules_1["min"] = "30";
filter_data_0_modules_1["max"] = "35";
filter_data_0_modules_1["func"] = "on";

JsonObject filter_data_0_modules_2 = filter_data_0_modules.createNestedObject();
filter_data_0_modules_2["title"] = "temperature-sensor";
filter_data_0_modules_2["slug"] = "temperature-sensor";
filter_data_0_modules_2["type"] = "sensor";
filter_data_0_modules_2["min"] = nullptr;
filter_data_0_modules_2["max"] = nullptr;
filter_data_0_modules_2["func"] = "default";

JsonObject filter_data_0_modules_3 = filter_data_0_modules.createNestedObject();
filter_data_0_modules_3["title"] = "Humidity-sensor";
filter_data_0_modules_3["slug"] = "Humidity-sensor";
filter_data_0_modules_3["type"] = "sensor";
filter_data_0_modules_3["min"] = nullptr;
filter_data_0_modules_3["max"] = nullptr;
filter_data_0_modules_3["func"] = "default";

JsonObject filter_data_0_modules_4 = filter_data_0_modules.createNestedObject();
filter_data_0_modules_4["title"] = "light sensor";
filter_data_0_modules_4["slug"] = "light-sensor";
filter_data_0_modules_4["type"] = "sensor";
filter_data_0_modules_4["min"] = "100";
filter_data_0_modules_4["max"] = "120";
filter_data_0_modules_4["func"] = "off";

JsonArray filter_data_0_item = filter_data_0.createNestedArray("item");

JsonObject filter_data_0_item_0 = filter_data_0_item.createNestedObject();
filter_data_0_item_0["code"] = true;
filter_data_0_item_0["value"] = true;
filter_data_0_item_0["module_name"] = "heater";

JsonObject filter_data_0_item_1 = filter_data_0_item.createNestedObject();
filter_data_0_item_1["code"] = "NRCON";
filter_data_0_item_1["value"] = "0";
filter_data_0_item_1["module_name"] = "air conditioner ";

JsonObject filter_data_0_item_2 = filter_data_0_item.createNestedObject();
filter_data_0_item_2["code"] = "N1STEMP";
filter_data_0_item_2["value"] = "0";
filter_data_0_item_2["module_name"] = "temperature sensor";

JsonObject filter_data_0_item_3 = filter_data_0_item.createNestedObject();
filter_data_0_item_3["code"] = "N2STEMP";
filter_data_0_item_3["value"] = "0";
filter_data_0_item_3["module_name"] = "temperature sensor";

JsonObject filter_data_0_item_4 = filter_data_0_item.createNestedObject();
filter_data_0_item_4["code"] = "N3STEMP";
filter_data_0_item_4["value"] = "0";
filter_data_0_item_4["module_name"] = "temperature sensor";

JsonObject filter_data_0_item_5 = filter_data_0_item.createNestedObject();
filter_data_0_item_5["code"] = "N1SHUM";
filter_data_0_item_5["value"] = "0";
filter_data_0_item_5["module_name"] = "humidity sensor";

JsonObject filter_data_0_item_6 = filter_data_0_item.createNestedObject();
filter_data_0_item_6["code"] = "N2SHUM";
filter_data_0_item_6["value"] = "0";
filter_data_0_item_6["module_name"] = "humidity sensor";

JsonObject filter_data_0_item_7 = filter_data_0_item.createNestedObject();
filter_data_0_item_7["code"] = "N3SHUM";
filter_data_0_item_7["value"] = "0";
filter_data_0_item_7["module_name"] = "humidity sensor";

JsonObject filter_data_0_item_8 = filter_data_0_item.createNestedObject();
filter_data_0_item_8["code"] = "N1SLIGHT";
filter_data_0_item_8["value"] = "0";
filter_data_0_item_8["module_name"] = "light sensor";

JsonObject filter_data_0_item_9 = filter_data_0_item.createNestedObject();
filter_data_0_item_9["code"] = "N2SLIGHT";
filter_data_0_item_9["value"] = "0";
filter_data_0_item_9["module_name"] = "light sensor";

JsonObject filter_data_0_item_10 = filter_data_0_item.createNestedObject();
filter_data_0_item_10["code"] = "N3SLIGHT";
filter_data_0_item_10["value"] = "0";
filter_data_0_item_10["module_name"] = "light sensor";

DynamicJsonDocument doc(1536);

DeserializationError error = deserializeJson(doc, a, DeserializationOption::Filter(filter));

if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}

JsonArray data_0_modules = doc["data"][0]["modules"];

JsonObject data_0_modules_0 = data_0_modules[0];
const char* data_0_modules_0_slug = data_0_modules_0["slug"]; // "Heater"
const char* data_0_modules_0_min = data_0_modules_0["min"]; // "15"
const char* data_0_modules_0_max = data_0_modules_0["max"]; // "20"

JsonObject data_0_modules_1 = data_0_modules[1];
const char* data_0_modules_1_slug = data_0_modules_1["slug"]; // "air-conditioner-(cold)"
const char* data_0_modules_1_min = data_0_modules_1["min"]; // "30"
const char* data_0_modules_1_max = data_0_modules_1["max"]; // "35"

const char* data_0_modules_2_slug = data_0_modules[2]["slug"]; // "temperature-sensor"

const char* data_0_modules_3_slug = data_0_modules[3]["slug"]; // "Humidity-sensor"

JsonObject data_0_modules_4 = data_0_modules[4];
const char* data_0_modules_4_slug = data_0_modules_4["slug"]; // "light-sensor"
const char* data_0_modules_4_min = data_0_modules_4["min"]; // "100"
const char* data_0_modules_4_max = data_0_modules_4["max"]; // "120"

for (JsonObject data_0_item_item : doc["data"][0]["item"].as<JsonArray>()) {

  const char* data_0_item_item_code = data_0_item_item["code"]; // "NRHEAT", "NRCON", "N1STEMP", ...
  const char* data_0_item_item_value = data_0_item_item["value"]; // "0", "0", "0", "0", "0", "0", "0", ...

}

The decoded Exception stack error


**xception 9: LoadStoreAlignmentCause: Load or store to an unaligned address** *Decoding 34 results* 0x40207ea2: **init_object** at /workdir/repo/gcc-gnu/libgcc/**unwind-dw2-fde.c** line **818** : **(inlined by) search_object** at /workdir/repo/gcc-gnu/libgcc/**unwind-dw2-fde.c** line **1001** 0x40203d57: **Stream::readString()** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**Stream.cpp** line **253** 0x402021a4: **ArduinoJson6185_91::ArrayShortcuts >::createNestedObject() const** at C:\Users\admin\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Array/**ArrayImpl.hpp** line **19** : **(inlined by) checkrelaycaran()** at G:\smiley farm\proto2/**proto2.ino** line **204** 0x40100584: **ets_post** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_main.cpp** line **181** 0x40100584: **ets_post** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_main.cpp** line **181** 0x401025b8: **pp_post** at ?? line **?** 0x40100584: **ets_post** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_main.cpp** line **181** 0x401025b8: **pp_post** at ?? line **?** 0x40101f02: **pp_soft_wdt_feed_local** at ?? line **?** 0x40100584: **ets_post** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_main.cpp** line **181** 0x40100584: **ets_post** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_main.cpp** line **181** 0x40103559: **wDev_ProcessFiq** at ?? line **?** 0x401060e9: **ets_timer_disarm** at ?? line **?** 0x40100584: **ets_post** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_main.cpp** line **181** 0x40100584: **ets_post** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_main.cpp** line **181** 0x401060e9: **ets_timer_disarm** at ?? line **?** 0x401060e9: **ets_timer_disarm** at ?? line **?** 0x40206bf2: **std::_Function_handler::_M_invoke(std::_Any_data const&)** at time.cpp line **?** 0x402051b1: **uart_peek_consume** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**uart.cpp** line **276** 0x40204694: **print_stack** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_postmortem.cpp** line **246** 0x402046a0: **print_stack** at core_esp8266_postmortem.cpp line **?** 0x40100d4f: **umm_free_core** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266\umm_malloc/**umm_malloc.cpp** line **549** 0x40203bf7: **unsigned int const& std::min(unsigned int const&, unsigned int const&)** at c:\users\admin\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\3.0.4-gcc10.3-1757bed\xtensa-lx106-elf\include\c++\10.3.0\bits/**stl_algobase.h** line **237** : **(inlined by) Print::print(__FlashStringHelper const*)** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**Print.cpp** line **103** 0x4020602c: **WVFState::WVFState()** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_waveform_pwm.cpp** line **64** : **(inlined by) __static_initialization_and_destruction_0** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_waveform_pwm.cpp** line **86** : **(inlined by) _GLOBAL__sub_I__setPWMFreq** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_waveform_pwm.cpp** line **666** 0x40100625: **millis** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_wiring.cpp** line **188** 0x40203d14: **Stream::timedRead()** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**Stream.cpp** line **40** 0x402035e9: **SoftwareSerial::~SoftwareSerial()** at ?? line **?** 0x401005a5: **esp_schedule** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**core_esp8266_main.cpp** line **129** 0x402051e8: **uart_read** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**uart.cpp** line **295** : **(inlined by) uart_read** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**uart.cpp** line **287** 0x401011e1: **cont_wrapper** at C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/**cont.S** line **81**

and of course the response
{"data":[{"title":"mesh","greenhouse_serial":"12345","modules":[{"title":"\u0647\u06cc\u062a\u0631","slug":"Heater","type":"controller","min":"15","max":"20","func":"on"},{"title":"\u0647\u0648\u0627\u0633\u0627\u0632 \u0633\u0631\u062f","slug":"air-conditioner-(cold)","type":"controller","min":"30","max":"35","func":"on"},{"title":"\u0633\u0646\u0633\u0648\u0631 \u062f\u0645\u0627","slug":"temperature-sensor","type":"sensor","min":null,"max":null,"func":"default"},{"title":"\u0633\u0646\u0633\u0648\u0631 \u0631\u0637\u0648\u0628\u062a","slug":"Humidity-sensor","type":"sensor","min":null,"max":null,"func":"default"},{"title":"\u0633\u0646\u0633\u0648\u0631 \u0646\u0648\u0631","slug":"light-sensor","type":"sensor","min":"100","max":"120","func":"off"}],"item":[{"code":"NRHEAT","value":"0","module_name":"\u0647\u06cc\u062a\u0631"},{"code":"NRCON","value":"0","module_name":"\u0647\u0648\u0627\u0633\u0627\u0632 \u0633\u0631\u062f"},{"code":"N1STEMP","value":"0","module_name":"\u0633\u0646\u0633\u0648\u0631 \u062f\u0645\u0627"},{"code":"N2STEMP","value":"7","module_name":"\u0633\u0646\u0633\u0648\u0631 \u062f\u0645\u0627"},{"code":"N3STEMP","value":"11","module_name":"\u0633\u0646\u0633\u0648\u0631 \u062f\u0645\u0627"},{"code":"N1SHUM","value":"0","module_name":"\u0633\u0646\u0633\u0648\u0631 \u0631\u0637\u0648\u0628\u062a"},{"code":"N2SHUM","value":"0","module_name":"\u0633\u0646\u0633\u0648\u0631 \u0631\u0637\u0648\u0628\u062a"},{"code":"N3SHUM","value":"0","module_name":"\u0633\u0646\u0633\u0648\u0631 \u0631\u0637\u0648\u0628\u062a"},{"code":"N1SLIGHT","value":"0","module_name":"\u0633\u0646\u0633\u0648\u0631 \u0646\u0648\u0631"},{"code":"N2SLIGHT","value":"0","module_name":"\u0633\u0646\u0633\u0648\u0631 \u0646\u0648\u0631"},{"code":"N3SLIGHT","value":"0","module_name":"\u0633\u0646\u0633\u0648\u0631 \u0646\u0648\u0631"}]}]}

i tried making it smaller by getting red of the unnecessary data but it didn't work, thanks in advance.

The JSON Assistant (Assistant | ArduinoJson 6) says that your document needs at least 1894 bytes. They recommend 2048.

thank you for your reply, i check it says 1536 bytes but in both cases how can i resolve this issue i have tried many various solutions but non of them work, and as you can see the response has a lot of repeated characters so its almost impossible let alone not logical to search for the data by character and then save them, which is why am using parsers, am stumped.

You are reading a character to see if it is a 'K' and then reading a DIFFERENT character to store in your array. You are going to have trouble parsing the JSON when you only store half the characters.

Does it work better if you use:

  while((char c = mySerial.read()) != 'K') {
        a[i]= c;
        i++;
      }

Hope your array 'a' is large enough for all of the characters. You aren't checking for running out of room.

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