Java Json 다루기(Java Jackson Examples)
새해 첫 포스팅입니다. 오늘은 자바에서 JSON을 다룰 수 있게 도와주는 Jackson 라이브러리에 대해 알아봅니다.
Maven Dependency
먼저 Jackson 라이브러리를 추가해줍니다.
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.4</version> </dependency>
이번 예제 코드를 위해 jUnit 라이브러리도 추가해줍니다.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
Code Examples
이제 코드를 작성해 Json 포맷을 다뤄봅니다.
다음 코드는 Jackson 라이브러리를 이용해 Json을 다루는 테스트 케이스들을 모아놓은 것입니다. 자세한 내용은 주석을 참고하세요.
/* JacksonTest.java */
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import static org.junit.Assert.assertTrue;
public class JacksonTest {
private ObjectMapper mapper;
@Before
public void setup(){
this.mapper = new ObjectMapper();
}
/**
* 이 테스트는 기본적인 사용 방법을 보여줍니다.
* @throws IOException
*/
@Test
public void testBasicCode() throws IOException {
/**
test.json 파일 내용
{
"name":"JDM",
"age":30,
"bool":true
}
*/
InputStream is = JacksonTest.class.getClassLoader()
.getResourceAsStream("test.json");
Map test = mapper.readValue(is, Map.class);
assertTrue("JDM".equals(test.get("name")));
assertTrue(30 == Integer.parseInt(test.get("age").toString()));
assertTrue(true == Boolean.parseBoolean(test.get("bool").toString()));
}
/**
* 이 테스트는 기본 json 포맷 내부 엘리먼트 요소로 list가 있는 경우
* model class를 사용해 처리하는 것을 보여줍니다.
* model class 소스 코드는 포스트 하단에 있습니다.
* @throws IOException
*/
@Test
public void testComplexCodeUsingModel() throws IOException {
/**
test2.json 파일 내용
{
"name":"JDM",
"age":30,
"bool":true,
"numbers":[1,2,3]
}
*/
InputStream is = JacksonTest.class.getClassLoader()
.getResourceAsStream("test2.json");
TestTwoModel test = mapper.readValue(is, TestTwoModel.class);
assertTrue(test.getName().equals("JDM"));
assertTrue(test.getAge() == 30);
assertTrue(test.isBool() == true);
assertTrue(test.getNumbers().size() == 3);
}
/**
* 이 테스트는 JsonNode를 사용하는 방법을 보여줍니다.
* @throws IOException
*/
@Test
public void testComplexCodeUsingJsonNode() throws IOException {
/**
test2.json 파일 내용
{
"name":"JDM",
"age":30,
"bool":true,
"numbers":[1,2,3]
}
*/
InputStream is = JacksonTest.class.getClassLoader()
.getResourceAsStream("test2.json");
JsonNode test = mapper.readValue(is, JsonNode.class);
/**
* .get()를 이용해서 원하는 필드의 값을 가져옵니다.
* .get()은 값을 찾을 수 없는 경우 null을 반환합니다.
*/
assertTrue(test.get("name").asText().equals("JDM"));
assertTrue(test.get("age").asInt() == 30);
assertTrue(test.get("bool").asBoolean() == true);
assertTrue(test.get("numbers").isArray());
/**
* .path()를 이용할 수도 있습니다.
* .get()와의 차이점은 값을 찾을 수 없는 경우 return 값으로
* MissingNode 객체를 반환합니다.
*/
assertTrue(test.path("name").asText().equals("JDM"));
}
/**
* JsonNode 객체는 불변(immutable)하는 객체기 때문에 값을 변경하려면
* 가변 객체인 ObjectNode로 캐스팅해서 바꿔야 합니다.
* @throws IOException
*/
@Test
public void testChangeValueUsingObejctNode() throws IOException {
String src = "{\"item\":\"i'm Item!\"}";
JsonNode obj = mapper.readValue(src, JsonNode.class);
assertTrue(obj.get("item").asText().equals("i'm Item!"));
((ObjectNode) obj).put("item", "change Value!"); // .set()을 사용해도 됩니다.
assertTrue(obj.get("item").asText().equals("change Value!"));
}
}
/* TestTwoModel.java */
import java.util.List;
public class TestTwoModel {
private String name;
private int age;
private boolean bool;
private List<Integer> numbers;
public List<Integer> getNumbers() {
return numbers;
}
public void setNumbers(List<Integer> numbers) {
this.numbers = numbers;
}
public boolean isBool() {
return bool;
}
public void setBool(boolean bool) {
this.bool = bool;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Closing Remarks
간단하게 자바 Json 처리를 도와주는 Jackson 라이브러리에 대해 알아봤습니다. :D