JSON( JavaScript Object Notation )은 Javascript 객체 문법으로 주로 Web 통신을 할 때 사용하는
너무나 편리한 구조로 되어 있습니다. 주로 서버와 클라이언트간의 데이터 방식으로 사용하지만
일반적인 소켓통신이나 환경설정 저장 방식에도 많이 사용합니다.
아두이노 라이브러리에도 여러가지가 있는데 그중에서 Arduino_JSON 을 사용하려고 합니다.
먼저, 헤더파일을 선언합니다.
Arduino_JSON 라이브러리를 설치합니다.
이전 강좌 참고
https://jooduino.tistory.com/4
아두이노 라이브러리 추가 방법
아두이노 IDE에 라이브러리 등록 방법 입니다. 라이브러리 등록 방법은 두 가지 입니다. 1. 라이브러리 매니저를 이용하는 방법. 2. 다운로드 받은 zip 파일 추가. 라이브러리 매니저를 이용하는 방
jooduino.tistory.com
#include <Arduino_JSON.h>
JSON 예문은 두 가지로 만들었습니다. 내용은 같습니다.
샘플1 : 스트링 형식 (보기 좋게 펼쳐서 만들었지만 한 줄로 만들어도 상관 없습니다.)
샘플2 : JSONVar 방식
// JSON 샘플1
const char json_sample[] PROGMEM = R"==(
{
"name" : "jooduino",
"age" : 20,
"etc" : "hello",
"group1" :
{
"int" : 99,
"double" : 3.14,
"string" : "hi~~"
},
"note" : "한글"
}
)==";
// JSON 샘플2
JSONVar JsonMakeData()
{
JSONVar json;
json["name"] = "jooduino";
json["age"] = 20;
json["etc"] = "hello";
json["group1"]["int"] = 99;
json["group1"]["double"] = 3.14;
json["group1"]["string"] = "hi~~";
json["note"] = "한글";
return json;
}
JSON 형식을 시리얼 창으로 확인할 때 좀더 보기 좋게 펼쳐서 보여 줍니다.
JSON 오브젝트가 어떤 타입인지 확인 할 수 있고, 몇개의 키값을 가지고 있는지 보여주는 예제 입니다.
jsonPrint 함수를 재귀호출하여 리스트안의 리스트를 계속해서 찾아낼 수 있습니다.
탭을 넣지 않아서 가독성은 조금 떨어집니다.
// JSON 내용 펼쳐서 인쇄
void jsonPrint( JSONVar obj, int depth ) {
Serial.println( "{" );
for( int x = 0; x < obj.keys().length(); x++ ) {
if((JSON.typeof( obj[obj.keys()[x]]) ).equals( "object" )) {
Serial.print( obj.keys()[x] );
Serial.println( " : " );
jsonPrint( obj[obj.keys()[x]], depth+1 );
}
else {
Serial.print( obj.keys()[x] );
Serial.print( " : " );
Serial.print( obj[obj.keys()[x]] );
if( x < obj.keys().length()-1 ) Serial.println( "," );
else Serial.println( "" );
}
}
if( depth == 0 ) Serial.println( "}" );
else {
Serial.print( "}" );
Serial.println( "," );
}
}
첫 번째 샘플 방식은 웹이나 저장 장치에서 읽어온 JSON 파일의 스트링 방식을 파싱하는 방법 입니다.
두 번째 샘플 방식은 JSON 형식으로 키와 데이터를 자유롭게 만들 수 있는 방식 입니다.
// JSONVar json = JSON.parse( json_sample ); // 첫 번째 방법
JSONVar json = JsonMakeData(); // 두 번째 방법
Serial.println( json );
Serial.println();
JSON 파일을 시리얼창으로 출력합니다. 두 번째 인자는 무조건 0을 넣어야 합니다. (root 라는 의미)
jsonPrint( json, 0 ); // JSON 내용 펼쳐서 인쇄
JSON 요소의 내용을 확인 합니다.
만약, 존재하는 키값이 있다면 키값에 해당하는 내용을 반환 하고 없는 키값을 읽어오려고 하면 null을 반환 합니다.
// JSON 요소 확인
Serial.println( json["note"] ); // 존재하는 키
Serial.println( json["test"] ); // 존재하지 않는 키
데이터 타입은 여러 종류가 있습니다.
각각의 타입으로 변환 하고 비교하는 예제 입니다.
double f = json["group1"]["double"]; // 실수형 변환
if( f == 3.14 ) Serial.println( "같다" ); // 실수형 비교
else Serial.println( "같지 않다" );
String s = json["note"]; // 스트링형 변환
if( s == "한글" ) Serial.println( "같다" ); // 스트링형 비교
else Serial.println( "같지 않다" );
전체 소스코드 입니다.
#include <Arduino_JSON.h>
// JSON 샘플1
const char json_sample[] PROGMEM = R"==(
{
"name" : "jooduino",
"age" : 20,
"etc" : "hello",
"group1" :
{
"int" : 99,
"double" : 3.14,
"string" : "hi~~"
},
"note" : "한글"
}
)==";
// JSON 샘플2
JSONVar JsonMakeData()
{
JSONVar json;
json["name"] = "jooduino";
json["age"] = 20;
json["etc"] = "hello";
json["group1"]["int"] = 99;
json["group1"]["double"] = 3.14;
json["group1"]["string"] = "hi~~";
json["note"] = "한글";
return json;
}
// JSON 내용 펼쳐서 인쇄
void jsonPrint( JSONVar obj, int depth ) {
Serial.println( "{" );
for( int x = 0; x < obj.keys().length(); x++ ) {
if((JSON.typeof( obj[obj.keys()[x]]) ).equals( "object" )) {
Serial.print( obj.keys()[x] );
Serial.println( " : " );
jsonPrint( obj[obj.keys()[x]], depth+1 );
}
else {
Serial.print( obj.keys()[x] );
Serial.print( " : " );
Serial.print( obj[obj.keys()[x]] );
if( x < obj.keys().length()-1 ) Serial.println( "," );
else Serial.println( "" );
}
}
if( depth == 0 ) Serial.println( "}" );
else {
Serial.print( "}" );
Serial.println( "," );
}
}
void setup() {
Serial.begin( 115200 );
// JSONVar json = JSON.parse( json_sample ); // 첫 번째 방법
JSONVar json = JsonMakeData(); // 두 번째 방법
Serial.println( json );
Serial.println();
jsonPrint( json, 0 ); // JSON 내용 펼쳐서 인쇄
Serial.println();
// JSON 요소 확인
Serial.println( json["note"] ); // 존재하는 키
Serial.println( json["test"] ); // 존재하지 않는 키
double f = json["group1"]["double"]; // 실수형 변환
if( f == 3.14 ) Serial.println( "같다" ); // 실수형 비교
else Serial.println( "같지 않다" );
String s = json["note"]; // 스트링형 변환
if( s == "한글" ) Serial.println( "같다" ); // 스트링형 비교
else Serial.println( "같지 않다" );
}
void loop() {
}
결과물 입니다.
'ESP32 > 펌웨어' 카테고리의 다른 글
ESP32 텔레그램 수신 (0) | 2023.10.18 |
---|---|
ESP32 텔레그램으로 메시지 보내기 (0) | 2023.10.16 |
ESP32 공유기 없이 통신 (1:1, 1:N) ESP-NOW (0) | 2023.10.08 |
ESP32 Captive Portal 사용하기 (0) | 2023.10.06 |
ESP32 환경설정 저장 - Preferences (0) | 2023.10.05 |