JSON)은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F0464a4f4-6bc4-48e0-b54c-8a3b1df07da6%252FUntitled.png%3Ftable%3Dblock%26id%3Dd8cd45f4-182c-4f26-b049-3bb5ea0913e4%26cache%3Dv2&w=3840&q=75)
데이터가 바이트스트림을 통해 전달되면 어떤 타입의 자료형이든 문자열 타입으로 전송된다.
하지만 문자열로 자료가 전송되면 두 가지 문제가 있다.
하나는 문자열로 전송되기 때문에 파싱을 할 수가 없고, 다른 하나는 오브젝트로 변환이 됐다 해도, 다른 언어로 만들어진 오브젝트를 내가 사용하는 언어와 문법이 다르다는 문제가 있다. 이것을 해결하기 위해 JSON 을 사용한다.
JSON 은 영어와 같은 공통어로 모든 프로그램 언어에서 사용할 수 있다. JavaScript 로 전송된 데이터는 JSON 으로 변환된 후 다시 Java 형태로 변환된다.
파싱(parsing) 은 데이터를 분석하고 해석하는 과정이다.
JSON 라이브버리 받기
위의 주소에서 원하는 버전을 선택한다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F09a8cac6-ade6-4400-b040-266a4bb92ff6%252FUntitled.png%3Ftable%3Dblock%26id%3Db638a284-f93e-454b-9d0a-f2a65c956ec2%26cache%3Dv2&w=3840&q=75)
Gradle 을 선택 후 아래의 주소를 복사한다. 그리고 아래의 주소도 같이 복사한다.
implementation group: 'org.springframework', name: 'spring-webflux', version: '5.0.2.RELEASE'
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F51ff28dc-75e8-4673-8c2b-47b68cc250b8%252FUntitled.png%3Ftable%3Dblock%26id%3D34fddae2-6362-40a4-87ee-8cd85ac3526c%26cache%3Dv2&w=3840&q=75)
인텔리J 의 build.gradle - dependencies 에 붙여넣은 후 오른쪽 상단의 코끼리 그림을 누르면 설치가 완료된다.
JSON 을 활용해 JavaScript 자료 출력하기
위의 사이트를 접속한다. Fake JSON API 란 임의로 개발한 API 에 대해 고정된 응답값을 보내주는 테스트용 API를 의미한다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F3f4301dd-62ac-4846-8ee4-17be47465431%252FUntitled.png%3Ftable%3Dblock%26id%3De71e0eb9-5ecf-43cd-8fc8-21a8a5233eec%26cache%3Dv2&w=3840&q=75)
사이트의 posts 를 들어가면 여러 데이터가 있는데 그중 userId가 1인 자료 값을 받아보자.
// https://jsonplaceholder.typicode.com/posts/1 { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }
{} 내부에 있는 자료형이 전송되면 바이트스트림을 타고 문자열로 전송된다.
문자열로 전송되면 내부에 있는 userId 나 id 값을 파싱할 수 없기 때문에 JSON 을 활용한다.
이제 코드를 만들어보자.
URL url = new URL("https://jsonplaceholder.typicode.com/todos/1"); HttpURLConnection conn = (HttpURLConnection) url.openConnection();
new URL 을 통해 주소를 받을 객체를 만든다. openConnection() 은 HTTP 프로토콜이 적용된 서브소켓이고, conn 은 소켓이다.
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.getBody()); } catch (MalformedURLException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
버퍼를 통해 데이터를 받고, readLine 을 통해 문자열을 읽는다.
download 은 외부로 부터 받은 문자열을 저장하는 변수다.
ObjectMapper 은 Jackson 라이브러리에서 제공되는 클래스로 JSON 문자열을 변환할 때 사용된다.
ObjectMapper 사용하기 위해서는 문자열을 저장할 오브젝트 클래스가 필요하다.
public class Post { int userId ; int id ; String title ; String body ; public int getUserId() { return userId; } public int getId() { return id; } public String getTitle() { return title; } public String getBody() { return body; } }
커스텀 자료형 클래스를 만들고 값을 출력하기 위한 getter까지 만들었다.
ObjectMapper 를 사용하기 위해선 커스텀 클래스에 디폴트 생성자가 반드시 필요하다.
지금은 매개변수가 있는 생성자가 없기 때문에 생성자를 만들지 않아도 자동으로 적용된다.
이제 전송된 데이터 문자열을 post.getBody() 같은 getter 를 통해 출력받을 수 있고 toStirng 값으로 출력할 수도 있다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F935548fd-c444-46a7-9a94-d9e8d82123cd%252FUntitled.png%3Ftable%3Dblock%26id%3D18c64dab-2787-4218-9374-2f44bb0099f3%26cache%3Dv2&w=3840&q=75)
Share article