본문 바로가기

언어/JAVA

카카오 2차 : JAVA로 JSON 파싱을 해보자!

반응형

현재 인턴으로 열심히 일을 하고 있지만.. kakao 2차기회가 주어져서 2차과제이 REST API 테스트를 위해서 간단한 JSON 파싱을 구현해보고한다.  REST API라고 말했지만 사실 HTTP API 에 가깝다 그이유는 redbinalgorithm.tistory.com/421 여기를 참고하도록 하자!

(사실 지금까지의 내용은 카카오 2차준비와 전~혀 관련없는 내용이다.)

 

mvnrepository.com/artifact/com.googlecode.json-simple/json-simple/1.1.1

 

Maven Repository: com.googlecode.json-simple » json-simple » 1.1.1

A simple Java toolkit for JSON com.googlecode.json-simple json-simple 1.1.1 // https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1' // https://mvnreposi

mvnrepository.com

몇개 의존성들을 찾아봤는데org 파서가 제일 좋아보인다. ( 프로그래머스에서도 당연히 사용할 수 있을...겁니다?)

 


	<dependencies>
		<dependency>
			<groupId>org.json</groupId>
			<artifactId>json</artifactId>
			<version>20160810</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.11.2</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.11.2</version>
		</dependency>
	</dependencies>

이렇게 java project에 의존성을 주입하고 다음과 같은 라이브러리를 사용할 수가 있습니다.

 

import org.json.simple.JSONArray;
import org.json.simple.JSONObject; 
import org.json.simple.parser.JSONParser; 
import org.json.simple.parser.ParseException;

 

그런데 막상 JSON 파서를 실험해볼려고 해도 적당한 파서값이 없네요... 카카오에서 준 REST API 스웨거로 테스팅하기위해서 java http contection을 구현하고 그값으로 파싱을 해보도록 하겠습니다.

 

httpbin.org/#/HTTP_Methods/get_get

 

httpbin.org

A simple HTTP Request & Response Service. Run locally: $ docker run -p 80:80 kennethreitz/httpbin

httpbin.org

위의 사이트는 카카오톡에서 REST API 테스트를 위한 주소이다 나도 이값으로 테스틀 해보겟다.

 

Requst

curl -X GET "https://httpbin.org/get" -H "accept: application/json"

Header에 accept json이 있다.. 받는사람이 json형식으로 받을거라니간 그렇게 보내주도록하자.

 

Response Body

{
  "args": {},
  "headers": {
    "Accept": "application/json",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "ko-kr",
    "Host": "httpbin.org",
    "Referer": "https://httpbin.org/",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Safari/605.1.15",
    "X-Amzn-Trace-Id": "Root=1-5f69f1db-66dbc54a39cc623b37de9d95"
  },
  "origin": "59.28.204.76",
  "url": "https://httpbin.org/get"
}

 

Response Header

access-control-allow-credentials: true 
access-control-allow-origin: * 
content-length: 493 
content-type: application/json 
date: Tue, 22 Sep 2020 12:45:15 GMT 
server: gunicorn/19.9.0 

 

 

자자 이제 요청하는값도 알았고 받는 값도 알았으니 얼른 파싱을 해보자

 

package basic;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class basicCode {

	public static void main(String[] args) throws IOException, ParseException {
		Map<String, Object> getmap = sentHttpGet("https://httpbin.org/get");

		System.out.println(getmap.get("origin"));
		
		HashMap<String, Object> requstMap = new HashMap<String, Object>();
		
		// body에 데이터 설정
		requstMap.put("DATA", "DATA");
		ObjectMapper mapper = new ObjectMapper();
		String json = mapper.writeValueAsString(requstMap);
		Map<String, Object> postmap = sentHttpPost("https://httpbin.org/post",json);
		System.out.println(postmap.get("origin"));
		
		
	}

	/**
	 * Post 요청
	 * 
	 * @throws ParseException
	 */
	public static Map<String, Object> sentHttpPost(String target,String jsonValue ) throws IOException, ParseException {

		URL url = new URL(target);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setDoOutput(true);
		conn.setRequestMethod("POST");
		conn.setRequestProperty("Content-Type", "application/json");
		conn.setRequestProperty("Accept-Chareset", "UTF-8");
		conn.setConnectTimeout(10000);
		conn.setReadTimeout(10000);
		
		OutputStream os = conn.getOutputStream();
		os.write(jsonValue.getBytes("UTF-8"));
		os.flush();
		
		
		StringBuilder result = new StringBuilder();
		String inputLine = null;
		
		BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

		while ((inputLine = in.readLine()) != null) {
			result.append(inputLine);
		}
		conn.disconnect();
		JSONParser parser = new JSONParser();
		Object obj = parser.parse(result.toString());
		JSONObject json = (JSONObject) obj;

		return getMapFromJsonObject(json);
	}

	/**
	 * Get 요청에 사용
	 * 
	 * @throws ParseException
	 */
	public static Map<String, Object> sentHttpGet(String target) throws IOException, ParseException {

		URL url = new URL(target);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setDoOutput(true);
		conn.setRequestMethod("GET");
		conn.setRequestProperty("Content-Type", "application/json");
		conn.setRequestProperty("Accept", "application/xml");
		conn.setConnectTimeout(10000);
		conn.setReadTimeout(10000);

		StringBuilder result = new StringBuilder();
		String inputLine = null;

		BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

		while ((inputLine = in.readLine()) != null) {
			result.append(inputLine);
		}
		conn.disconnect();
		JSONParser parser = new JSONParser();
		Object object = parser.parse(result.toString());
		JSONObject json = (JSONObject) object;

		return getMapFromJsonObject(json);
	}

	/**
	 * JsonObject를 Map<String, String>으로 변환한다.
	 *
	 * @param jsonObj JSONObject.
	 * @return Map<String, Object>.
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> getMapFromJsonObject(JSONObject jsonObj) {
		Map<String, Object> map = null;

		try {

			map = new ObjectMapper().readValue(jsonObj.toJSONString(), Map.class);

		} catch (JsonParseException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return map;
	}
}

 

get요청에 대해서는 URL만 입력하고 출력하면 그만이니 어려운게 없어보인다.

 

POST 요청에는 URL 이외의 정보가 body안에 이루어져잇는데 이것은 설정하는 방법은 다양하지만 사용하기 편하게할려면

Map or Class 형식에 Object를 만든 다음   String 형식으로 파싱한다.

 

ex) "{\"DATA\" : \"DATA\"}" 물론 이런 형태를 일일이 + 를 사용해서 만들기란 여간 귀찮은일이 아니다..다행히 이러한 일은 ObjectMapper에 writeValueString이 해준다... 이렇게 바뀐 String 형식을 byte[]로 바꾼다 (이작업을 직렬화! 라고한다.)

 

직렬화 역직렬화가 머냐면 TMI로 JAVA에서만 사용하는 약속이아니라 웹에서도 사용하기 쉽게 바꿔주는거다 (속도적인 측면에서도 좋음)

원래 우리 데이터는 웹상에서 바이트코드로 돌아다님

 

여튼OutputStream에 body값을 설정해주고 보내면된다. 현재 예제에서는 body값이 필요가 없는 예제이지만 혹시나 쓸일잇을까 싶어서 만들어놨다. 그 외에 URL에 ? 뒤에 직접 붙는 정보에 대해서는 URL에 바로붙혀도 되니 언급하지않겠다.

 

 

 

음 ... get도 헷으니 POST도 해야겠지..?

 

여기보면 jsonParsing에 대해서 자세하게 나온다.

 

www.baeldung.com/httpurlconnection-post

 

Making a JSON POST Request With HttpURLConnection | Baeldung

A quick and practical introduction to issuing POST requests using HttpURLConnection.

www.baeldung.com

 

반응형

'언어 > JAVA' 카테고리의 다른 글

try-with-resources  (1) 2022.08.21
Servlet API란? Gradle을 이용해서 이클립스에 ServletAPI를 등록  (0) 2020.08.08
java : ArrayList : subList, reverse  (0) 2020.05.13
PS 용 baseCode(추가예정)  (0) 2020.03.07
백준 : 15684  (0) 2020.01.30