
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;
}
}

lombok 사용 방법
1) lombok 이라는 외부 라이브러리 설치



2) 인텔리 J에 적용

3) 인텔리 J에서 설치 확인 > Lombok 설치 확인 : 안되어있으면 설치

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

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