I'm aware of a few JSON parsing libraries for Arduino.
I've never used any of these but I did do some simple JSON parsing in a project I'm working on so I'll show you how I did that.
NOTE: I'm reading serial data using the software serial library. You'll need to change this code to work for you. This will only work on very simple JSON strings. It's very limited but if that's all you're parsing then it'll work.
Example of JSON response from server:
{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}
First, only read data between curly braces.
String response = "";
bool begin = false;
while (SIM900.available() || !begin) {
char in = SIM900.read();
if (in == '{') {
begin = true;
}
if (begin) response += (in);
if (in == '}') {
break;
}
delay(1);
}
This code reads data one byte at a time and once it gets an open brace, it starts saving it into response
. When it gets a closing brace, it ends it. So here's a clear limitation, you can only have one set of opening/closing braces in your string.
Once I have the string, I use indexOf
and substring
to extract relevant information:
start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);
This code sets start
to the beginning of id":"
+ 5 characters in the string. It's +5 because that's how long id":"
is. So start
points to TEST1
in the JSON string. In my system, the ID is always going to be 5 characters long so end is start + 5
. I then use substring
to extract that.
Again, before anyone starts down voting me for this horrible solution: if you know exactly what you're working with, and understand the limitations of this code, then this is not a bad solution. It's a solution that gets the job done.