Recent Posts
Recent Comments
Link
12-08 00:08
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

JAVA URL, JSON 처리 본문

DEV&OPS/Java

JAVA URL, JSON 처리

ALEPH.GEM 2024. 5. 8. 20:44

1. java.net.URL 클래스

java.net.URL 클래스는 네트워크상의 URL과 자원을 처리합니다.
웹 페이지, 이미지, 동영상, 스크립트 등 다양한 형태의 자원을 다룰 수 있습니다.
또한 URL 문자열을 객체로 표현하고 다양한 정보를 추출하는 데 사용됩니다.

중요 기능

  • URL 문자열 파싱 및 객체 생성: URL 문자열 자체를 파싱하여 객체를 생성합니다.
  • URL 정보 추출: URL의 프로토콜, 호스트, 포트, 경로, 쿼리 문자열 등 다양한 정보를 추출할 수 있습니다.
  • 자원 접근: openConnection() 메서드를 통해 URL에 해당하는 자원에 대한 연결을 생성하고, openStream() 메서드를 통해 입력 스트림을 얻어 자원의 내용을 읽을 수 있습니다.
  • URL 유효성 검사: toExternalForm() 메서드를 통해 URL 문자열을 다시 문자열 형태로 변환하고, equals() 메서드를 통해 두 URL 객체의 동일성을 비교할 수 있습니다.

 

예제

public static void main(String[] args) {

    URL url = new URL("https://www.example.com/index.html");

    //URL 정보 추출 후 출력
    System.out.println("프로토콜: " + url.getProtocol());
    System.out.println("호스트: " + url.getHost());
    System.out.println("포트: " + url.getPort());
    System.out.println("경로: " + url.getPath());
    System.out.println("쿼리 문자열: " + url.getQuery());

    //URL 자원 접근 및 내용 읽기
    URLConnection conn = url.openConnection();
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
    	System.out.println(line);
    }
    reader.close();
}


참고:  https://docs.oracle.com/javase/8/docs/api/java/net/URL.html

 

URL (Java Platform SE 8 )

Creates a URL object from the specified protocol, host, port number, and file. host can be expressed as a host name or a literal IP address. If IPv6 literal address is used, it should be enclosed in square brackets ('[' and ']'), as specified by RFC 2732;

docs.oracle.com

 


2. com.fasterxml.jackson.core 라이브러리

라이브러리 설정
Maven의 경우 pom.xml 의존성을 추가 합니다. 

<dependency>
  <groupId>cohttp://m.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.13.1</version>
</dependency>


예제

다음은 JsonFactory와 JsonParser를 이용하여 JSON object를 파싱하고 출력하는 예제입니다.

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.IOException;

public class JsonParserExample {
    public static void main(String[] args) {
        try {
            // 샘플용 JSON 데이터
            String jsonData = "{\"name\":\"요한\", \"age\":99, \"city\":\"베들레햄\"}";
            // JsonParser 생성
            JsonFactory factory = new JsonFactory();
            JsonParser parser = factory.createParser(jsonData);
            // 파싱 시작
            while (!parser.isClosed()) {
                JsonToken token = parser.nextToken(); // 다음 토큰 가져오기
                // 토큰이 끝나면 반복문 종료
                if (token == null){
                    break;
                }
                // 토큰 유형에 따라 처리
                switch (token) {
                    case FIELD_NAME:
                        // 필드 이름일 경우
                        String fieldName = parser.getCurrentName();
                        System.out.print(fieldName + ": ");
                        break;
                    case VALUE_STRING:
                    case VALUE_NUMBER_INT:
                        // 문자열 또는 숫자 값일 경우
                        System.out.println(parser.getText());
                        break;
                    default:
                        break;
                }
            }
            parser.close(); 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


참고:  https://github.com/FasterXML/jackson-databind

 

GitHub - FasterXML/jackson-databind: General data-binding package for Jackson (2.x): works on streaming API (core) implementatio

General data-binding package for Jackson (2.x): works on streaming API (core) implementation(s) - FasterXML/jackson-databind

github.com

 

3. JsonToken 클래스

JsonToken 클래스는 JSON 데이터를 파싱 할 때 발생할 수 있는 다양한 유형의 토큰들을 다룰 수 있게 합니다.

 

JsonToken 클래스의 중요 상수와 그 용도

  • START_OBJECT: JSON 객체의 시작 중괄호 { 를 나타냅니다.
  • END_OBJECT: JSON 객체의 끝 중괄호 }를 나타냅니다. 
  • START_ARRAY: JSON 배열의 시작 대괄호 [ 를 나타냅니다. 
  • END_ARRAY: JSON 배열의 끝 대괄호 ]를 나타냅니다. 
  • FIELD_NAME: JSON 객체 내의 필드 이름(key 값)을 나타냅니다. 
  • VALUE_STRING: JSON 문자열 value 값을 나타냅니다.   
  • VALUE_NUMBER_INT: JSON 정수 값을 나타냅니다. 
  • VALUE_NUMBER_FLOAT: JSON 부동 소수점 값을 나타냅니다. 
  • VALUE_TRUE: JSON 불리언 true 값을 나타냅니다. 
  • VALUE_FALSE: JSON 불리언 false 값을 나타냅니다. 
  • VALUE_NULL: JSON null 값을 나타냅니다. 

 

다음은 JSON array 데이터를 JsonToken을 이용하여 파싱하고 출력하는 예제입니다.

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.IOException;

public class JsonArrayParserExample {
    public static void main(String[] args) {
        try {
            String jsonArray = "[{\"name\":\"바울\", \"age\":99}, {\"name\":\"요한\", \"age\":98}]";
            JsonFactory factory = new JsonFactory();
            JsonParser parser = factory.createParser(jsonArray);

            // 파싱 시작
            while (!parser.isClosed()) {
                JsonToken token = parser.nextToken(); // 다음 토큰 가져오기
                // 토큰이 끝나면 반복문 종료
                if (token == null){
                    break;
                }
                if (token == JsonToken.START_ARRAY) {
                    //토큰이 배열 시작기호인 "[" 인경우 
                    continue;
                }
                // 토큰이 JSON object인 경우
                if (token == JsonToken.START_OBJECT) {
                    // 객체 내부 파싱
                    while (parser.nextToken() != JsonToken.END_OBJECT) {
                        String fieldName = parser.getCurrentName();
                        parser.nextToken(); //다음 토큰으로 이동
                        if ("name".equals(fieldName)) {
                            System.out.println("이름: " + parser.getText());
                        } else if ("age".equals(fieldName)) {
                            System.out.println("나이: " + parser.getIntValue());
                        }
                    }
                }
            }
            parser.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

getText()와 nextTextValue()의 비교

  • parser.getText()는 현재 토큰의 텍스트 값을 반환합니다. 현재 토큰이 시작 객체, 끝 객체, 필드 이름 등 텍스트 값을 가지지 않는 특수 토큰인 경우에 예외를 던지지 않고 빈 문자열을 반환합니다.
  • parser.nextTextValue()는 현재 토큰 위치에서 다음 토큰의 텍스트 값을 반환합니다. 만약 현재 토큰이 텍스트 값을 가지지 않는 특수 토큰인 경우, 이 메서드는 null을 반환하는 것이 차이입니다. 그래서 null을 반환하는 경우에는 다음 토큰에 텍스트 값이 없는 것입니다. 주로 배열 또는 객체 내의 값들을 반복적으로 읽을 때 유용하게 사용됩니다.

보통 Json Array를 처리할 때 nextTextValue()를 사용하지만 아래처럼 getText()를 사용할 수도 있습니다. 

//values가 String 배열일 때
for(int i = 0; i < values.length; i++){
	while(token != JsonToken.END_ARRAY) {
		values[i] = jp.getText();
		token = jp.nextToken();										
	}
}

 

 

 

 

 

 

 

 

 

728x90