Json

JSON

: Javascript Object Notation의 약어로 데이터를 구조화해서 활용 가능하게 해주는 포맷이다.

1.특징

  1. javascript 객체 문법을 따른다.
  2. 용량이 작아서 데이터 전송에 용이하다.
  3. 단순한 데이터 표현 방법일 뿐이다.
  4. 데이터 구분이 명확하다.
  5. 서버와 client간 통신에 많이 사용된다.
  6. 모든 언어가 json을 지원한다.

2.문법

  • 기본포맷
{"key":"value","k2":"v2","k3":"v3"}
  • 중첩포맷
{           
				"kkk1" : {"key":"value","k2":"v2","k3":"v3"}       
				"kkk2" : {"key":"value","k2":"v2","k3":"v3"}       
}     

3.생성자

  1. json객체 생성하기
JSONObject 객체명 = new JSONObject();
  1. json들이 들어있는 Array 생성하기
JSONArray 객체명 = new JSONArray();
  1. json 파싱 객체 생성하기
JSONParser 파서 = new JSONParser();

JSONObject 객체명 = (JSONObject)파서.parse(파싱하고자하는객체);
※ 여기서 파싱이란?
어떤 문장의 구조를 파악하는 행위를 일컫는다. 즉, json이나 html 등의 원시 프로그램파일을 파서(파싱해주는 프로그램)에 입력으로 집어넣으면, 출력으로 구문을 해석할 수 있는 단위인 Object나 Array등이 나오게 된다.

4.메서드

  1. JSONObject 값 넣기
객체명.put( key값 , value값 );
  1. JSONObject에 찾고있는 key값 존재하는지 확인하기
객체명.containsKey( key값 );
  1. JSONObject에 찾고있는 value값 존재하는지 확인하기
객체명.containsValue( value값 );
  1. JSONObject 해당 key의 value값 반환하기
객체명.get( key값 );
  1. JSONObject Set타입으로 반환하기
객체명.entrySet();
  1. JSONObject String타입로 반환하기
객체명.toJSONString();
  1. JSONArray 값 넣기
객체명.add( 데이터 );

5.String <–> JSON

데이터베이스처럼 json을 사용하려 했기 때문에 json파일로 만들어 저장, 저장된 json파일을 읽어서 데이터 불러오기 등의 기능을 구현하기 위해 json형식과 String타입을 오가는 방식을 알아보았다.

  1. 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();
}
  1. 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?”이 출력된다.

results matching ""

    No results matching ""