삶 가운데 남긴 기록 AACII.TISTORY.COM
JAVA URL, JSON 처리 본문
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
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
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
'DEV&OPS > Java' 카테고리의 다른 글
이클립스 웹 프로젝트 이름 변경 (0) | 2024.05.10 |
---|---|
이클립스 속도 튜닝 (0) | 2024.05.10 |
JAVA application 런타임 상태 정보 유지 기법 (0) | 2024.05.08 |
Jasypt(Java Simplified Encryption) 사용 방법 (0) | 2024.05.08 |
JAVA Visitor 패턴 - 자료구조를 돌아다니면서 처리 (0) | 2024.05.08 |