JSON

Jan 12, 2024
JSON

JSON(JavaScript Object Notation)

Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷
데이터 전송(통신)할 때 사용
 
Json Object: {“키” : 값, “키” : 값 // 문자열 “ ”}
Java Object : {키:값, 키:값 // 문자열: ‘ ’}
 
데이터가 하나가 아니고 여러 개면 배열에 넣을 수 있음
언어마다 각자의 Object를 가지고 있고 다름
backtick : 한꺼번에 엔터친 문자를 묶을 때 → 파싱을 구문 분석을 못함 → 찾을 수 없음
스트림을 통해 전송할때 바이트가 연속적으로 내려감 : 모든 경우의 수에서도 모두 문자열로 내려감 → 오브젝트가 아니라서 상대방이 처리하기 불편함
 

다른 프로그램에게 통신할 때 문제

1) Object→ 문자열로 인식
2) 문자열로 변환 → 자바가 이해 못함
객체 연산자로 .해서 찾을 수 없음/ 파싱 불가

같은 프로그램끼리 통신할 때 문제

1) Object→ 문자열로 전송
3) 문자열 → Object로 변환해야 함
 

Json 데이터를 자바 Object 데이터로 변환할 때 : 빈 생성자가 필요함

 
Jackson : Json을 파싱해주는 라이브러리
ObjectMapper : 빈 생성자를 통해서 객체를 만들어냄
Reflection : private 접근자에 직접적으로 접근해서 값을 넣어줌
실행 시에 메모리에 있는 데이터를 다 분석해서 넣어주는 기법
💡
Java의 Reflection API가 접근 수준을 무시하는 일부 메커니즘을 제공
일종의 메타프로그래밍 기법
실행 중에 클래스의 구조를 조사하고 조작하는 기능을 제공 → private 멤버에도 접근

파싱 연습문제


package com.metacoding.myhttp; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class MyApp2 { public static void main(String[] args) { try { URL url = new URL("https://jsonplaceholder.typicode.com/posts/1"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream()) ); String download = ""; while (true) { String line = br.readLine(); if(line == null) { break; } download = download + line; } ObjectMapper om = new ObjectMapper(); Post post = om.readValue(download, Post.class); System.out.println(post.getTitle()); } catch (Exception e) { throw new RuntimeException(e); } } }
package com.metacoding.myhttp; public class Post { private int userId; private int id; private String title; private String body; public Post() {} public Post(int userId, int id, String title, String body) { this.userId = userId; this.id = id; this.title = title; this.body = body; } public int getUserId() { return userId; } public int getId() { return id; } public String getTitle() { return title; } public String getBody() { return body; } }
notion image

lombok 사용 방법


1) lombok 이라는 외부 라이브러리 설치
notion image
notion image
notion image
 
2) 인텔리 J에 적용
notion image
 
3) 인텔리 J에서 설치 확인 > Lombok 설치 확인 : 안되어있으면 설치
notion image

Annotation

: JVM이 확인하는 주석
컴파일러에게 추가적인 정보를 제공하거나 런타임 시에 동작을 변경하기 위해 사용
 
@AllArgsConstructor : 클래스의 모든 필드에 대한 생성자를 자동으로 생성
@NoArgsConstructor : 매개변수가 없는 기본 생성자를 자동으로 생성
@Data
: @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 다 추가
 
플러그인(Plugin)
: 어떤 소프트웨어에 추가적인 기능을 제공하기 위해 모듈 형태로 개발된 소프트웨어 컴포넌트
 
자기 object를 문자열로 변환하여 전송
> 문자열로 날아온 json을 사용하기 편하게 java object로 변환
 
notion image

Json 사용 이유

  • 경량이 제일 가벼움 : 모든 언어의 object를 제일 적은 용량으로 표현 가능
  • 전세계 표준 공용어
 
Json이전에 사용하던 것이 xml : 공용어

연습문제


package com.metacoding.myhttp; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class MyApp2 { public static void main(String[] args) { try { URL url = new URL("https://jsonplaceholder.typicode.com/posts/1"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream()) ); String download = ""; while (true) { String line = br.readLine(); if (line == null) break; download = download + line; } //System.out.println(download); ObjectMapper om = new ObjectMapper(); Post post = om.readValue(download, Post.class); System.out.println("=========================="); System.out.println("check : "+post.getTitle()); } catch (Exception e) { throw new RuntimeException(e); } } }
class User { int id = 1; String username = "ssar"; } <user> <id>1</id> <username>"ssar"</username> </user> { "id":1, "username":"ssar" }

Share article

vosw1