I'm using the ArduinoJson library. There is a great example for parsing a single JSON object in the source code. I am attempting to iterate over an array of JSON objects:
#include <JsonParser.h>
using namespace ArduinoJson::Parser;
void setup() {
Serial.begin(9600);
char json[] = "[{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}, \
{\"sensor\":\"gps\",\"time\":1351824140,\"data\":[50.756080,21.302038]}]";
JsonParser<32> parser;
JsonArray root = parser.parse(json);
if (!root.success()) {
Serial.println("JsonParser.parse() failed");
return;
}
for (JsonArrayIterator item = root.begin(); item != root.end(); ++item) {
// unsure of what to do here.
Serial.println((*item)["data"]);
// results in:
// ParseJsonArray:21: error: call of overloaded
// 'println(ArduinoJson::Parser::JsonValue)' is ambiguous
JsonObject something = JsonObject(*item);
Serial.println(something["sensor"]);
// results in :
// ParseJsonArray:26: error: call of overloaded
// 'println(ArduinoJson::Parser::JsonValue)' is ambiguous
}
}
void loop() {}
item is of type JsonValue. I would like to treat it as a JsonObject and pull some data out of it.
-
does the data parse from above object is for both sensor how to parse value of each object of jason LIKE i have [{"sensor":"gps", "time":"1351824120"},{"sensor":"temp", "time":"1351824120"}]user13842– user138422015年10月07日 05:26:59 +00:00Commented Oct 7, 2015 at 5:26
2 Answers 2
This is how I would write this loop:
for (JsonArrayIterator it = root.begin(); it != root.end(); ++it)
{
JsonObject row = *it;
char* sensor = row["sensor"];
long time = row["time"];
double latitude = row["data"][0];
double longitude = row["data"][1];
Serial.println(sensor);
Serial.println(time);
Serial.println(latitude, 6);
Serial.println(longitude, 6);
}
And, if C++11 is available (which is not the case with Arduino IDE 1.0.5):
for (auto row : root)
{
char* sensor = row["sensor"];
long time = row["time"];
double latitude = row["data"][0];
double longitude = row["data"][1];
Serial.println(sensor);
Serial.println(time);
Serial.println(latitude, 6);
Serial.println(longitude, 6);
}
Got it! Initially, casting the retrieval of the item from the JsonObject before printing was enough.
JsonObject something = JsonObject(*item);
Serial.println((char*)something["sensor"]);
Although, I think this looks better.
char* sensor = (*item)["sensor"];
Serial.println(sensor);