Json
JSON
: Javascript Object Notation의 약어로 데이터를 구조화해서 활용 가능하게 해주는 포맷이다.
1.특징
- javascript 객체 문법을 따른다.
- 용량이 작아서 데이터 전송에 용이하다.
- 단순한 데이터 표현 방법일 뿐이다.
- 데이터 구분이 명확하다.
- 서버와 client간 통신에 많이 사용된다.
- 모든 언어가 json을 지원한다.
2.문법
- 기본포맷
{"key":"value","k2":"v2","k3":"v3"}
- 중첩포맷
{
"kkk1" : {"key":"value","k2":"v2","k3":"v3"}
"kkk2" : {"key":"value","k2":"v2","k3":"v3"}
}
3.생성자
- json객체 생성하기
JSONObject 객체명 = new JSONObject();
- json들이 들어있는 Array 생성하기
JSONArray 객체명 = new JSONArray();
- json 파싱 객체 생성하기
JSONParser 파서 = new JSONParser();
JSONObject 객체명 = (JSONObject)파서.parse(파싱하고자하는객체);
- ※ 여기서 파싱이란?
- 어떤 문장의 구조를 파악하는 행위를 일컫는다. 즉, json이나 html 등의 원시 프로그램파일을 파서(파싱해주는 프로그램)에 입력으로 집어넣으면, 출력으로 구문을 해석할 수 있는 단위인 Object나 Array등이 나오게 된다.
4.메서드
- JSONObject 값 넣기
객체명.put( key값 , value값 );
- JSONObject에 찾고있는 key값 존재하는지 확인하기
객체명.containsKey( key값 );
- JSONObject에 찾고있는 value값 존재하는지 확인하기
객체명.containsValue( value값 );
- JSONObject 해당 key의 value값 반환하기
객체명.get( key값 );
- JSONObject Set타입으로 반환하기
객체명.entrySet();
- JSONObject String타입로 반환하기
객체명.toJSONString();
- JSONArray 값 넣기
객체명.add( 데이터 );
5.String <–> JSON
데이터베이스처럼 json을 사용하려 했기 때문에 json파일로 만들어 저장, 저장된 json파일을 읽어서 데이터 불러오기 등의 기능을 구현하기 위해 json형식과 String타입을 오가는 방식을 알아보았다.
- String –> JSON
파일로 저장되어 있어 File을 통해 불러오면 String타입일 경우 다음과 같은 파싱을 통해 JSONObject로 바꿔줄 수 있다.
JSONParser parser = new JSONParser();
try {
File file = new File("위치\\filename.json");
FileReader fileReader = new FileReader(file);
Object obj = parser.parse(fileReader);
JSONObject result = (JSONObject) obj;
fileReader.close(); // 오류를 피하기 위해 꼭 닫기
System.out.println(result);
} catch (IOException | ParseException e) {
e.printStackTrace();
}
- JSON –> String
JSONObject를 파일로 저장하고 싶을 때는 toJSONString 메서드를 사용한다.
JSONObject jsonObject = new JSONObject();
try {
File file = new File("위치\\filename.json");
FileWriter fileWriter = new FileWriter(file); // 파라미터에 true를 추가하면 덮어쓰기 기능 사용가능
fileWriter.write(jsonObject.toJSONString());
fileWriter.flush(); // 오류를 피하기 위해 꼭 비우기
fileWriter.close(); // 오류를 피하기 위해 꼭 닫기
} catch (IOException e) {
e.printStackTrace();
}
6.OPEN API를 활용한 연습
링크 : https://developers.naver.com/docs/papago/papago-nmt-example-code.md
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
// 네이버 기계번역 (Papago SMT) API 예제
public class ApiExamTranslateNmt {
public static void main(String[] args) {
String clientId = "YOUR_CLIENT_ID";//애플리케이션 클라이언트 아이디값";
String clientSecret = "YOUR_CLIENT_SECRET";//애플리케이션 클라이언트 시크릿값";
String apiURL = "https://openapi.naver.com/v1/papago/n2mt";
String text;
try {
text = URLEncoder.encode("안녕하세요. 오늘 기분은 어떻습니까?", "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("인코딩 실패", e);
}
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", clientId);
requestHeaders.put("X-Naver-Client-Secret", clientSecret);
String responseBody = post(apiURL, requestHeaders, text);
System.out.println(responseBody);
}
private static String post(String apiUrl, Map<String, String> requestHeaders, String text){
HttpURLConnection con = connect(apiUrl);
String postParams = "source=ko&target=en&text=" + text; //원본언어: 한국어 (ko) -> 목적언어: 영어 (en)
try {
con.setRequestMethod("POST");
for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
con.setRequestProperty(header.getKey(), header.getValue());
}
con.setDoOutput(true);
try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
wr.write(postParams.getBytes());
wr.flush();
}
int responseCode = con.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 응답
return readBody(con.getInputStream());
} else { // 에러 응답
return readBody(con.getErrorStream());
}
} catch (IOException e) {
throw new RuntimeException("API 요청과 응답 실패", e);
} finally {
con.disconnect();
}
}
private static HttpURLConnection connect(String apiUrl){
try {
URL url = new URL(apiUrl);
return (HttpURLConnection)url.openConnection();
} catch (MalformedURLException e) {
throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
} catch (IOException e) {
throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
}
}
private static String readBody(InputStream body){
InputStreamReader streamReader = new InputStreamReader(body);
try (BufferedReader lineReader = new BufferedReader(streamReader)) {
StringBuilder responseBody = new StringBuilder();
String line;
while ((line = lineReader.readLine()) != null) {
responseBody.append(line);
}
return responseBody.toString();
} catch (IOException e) {
throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
}
}
}
네이버에서 제공하는 파파고 OPEN API를 활용해 실습해본다. 먼저 링크된 사이트에서 언급했듯이 애플리케이션 등록을 통해 YOUR_CLIENT_ID, YOUR_CLIENT_SECRET을 개인적으로 받아서 값으로 넣어주어야 한다.
이후에 코드를 실행시켜보면
{“message”:{“result”:{“srcLangType”:”ko”,”tarLangType”:”en”,”translatedText”:”Hello. How are you today?”,”engineType”:”N2MT”,”pivot”:null,”dict”:null,”tarDict”:null},”@type”:”response”,”@service”:”naverservice.nmt.proxy”,”@version”:”1.0.0”}}
다음과 같은 결과값이 출력된다.
String responseBody = post(apiURL, requestHeaders, text);
System.out.println(responseBody);
이는 위와같이 main메서드에서 선언된 responseBody라는 String타입이 출력된 결과이고, 중첩포맷의 json 형식이라는 것을 알 수 있다.
json-simple이라는 Json데이터 처리용 라이브러리를 이용해 responseBody변수를 json데이터로 만들어 가공해본다.(json-simple사용을 위해 Maven설정에서 pom.xml의 dependency에 json-simple추가)
public static void stringToJson(String v) {
JSONParser jsonParser = new JSONParser();
try {
JSONObject jsonObj1 = (JSONObject) jsonParser.parse(v);
JSONObject jsonObj2 = (JSONObject) jsonObj1.get("message");
JSONObject jsonObj3 = (JSONObject) jsonObj2.get("result");
System.out.println(jsonObj3.get("translatedText"));
} catch (ParseException e) {
e.printStackTrace();
}
}
static으로 String을 파라미터로 받는 stringToJson이라는 메서드를 만든다. 메서드 내용으로는 json-simple API를 활용해 JSONParser 객체를 만들어 주고 이 객체를 파싱하고 get메서드로 key값을 이용해 원하는 value를 착출해서 출력한다. 즉, message –> result –> translatedText 의 value값 “Hello. How are you today?”이 출력된다.