본문 바로가기
  • 재미있는 펌웨어와 코딩
ESP32/펌웨어

아두이노 JSON 사용하기

by 윤재윤호 2023. 10. 9.

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() {
}

 

결과물 입니다.

실행한 결과