본문으로 바로가기

1. Jackson Databind 라이브러리 추가

Gradle Project

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.2'

 

Maven Project

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.2</version>
</dependency>

 

2. Json 문자열 데이터 및 자바 객체 (예시)

Json String Data Sample (예시 데이터)

// json 예시
{
	"companyName": "Apple Inc",
	"ticker": "AAPL",
	"market": "NASDAQ",
	"price": 163.98
}

// 자바 소스(Json 문자열)
String jsonString = "{\"companyName\":\"Apple Inc\"," +
                     "\"ticker\":\"AAPL\"," +
                     "\"market\":\"NASDAQ\"," +
                     "\"price\":163.98}";

 

Java Object

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Stock {

    public enum Market {NYSE, NASDAQ, AMEX};
    private String companyName;
    private String ticker;
    private Market market;
    private Double price;

    // 기본 생성자
    public Stock() {}

    public Stock(String companyName, String ticker, Market market, Double price) {
        this.companyName = companyName;
        this.ticker = ticker;
        this.market = market;
        this.price = price;
    }

    public String getCompanyName() {
        return companyName;
    }

    public String getTicker() {
        return ticker;
    }

    public Double getPrice() {
        return price;
    }

    public Market getMarket() {
        return market;
    }
}

 

3. Json String To Java Object

방법

1. ObjectMapper 객체 생성

ObjectMapper

  : Jackson 라이브러리의 클래스

  : JSON 콘텐츠를 Java 객체로 deserialization (역직렬화) 하거나

  : Java 객체를 JSON으로 serialization (직렬화)

 

2. readValue(String content, Class<T> valueType) 메소드 사용

 

Json String To Java Object 예시

String jsonString = "{\"companyName\":\"Apple Inc\"," +
                     "\"ticker\":\"AAPL\"," +
                     "\"market\":\"NASDAQ\"," +
                     "\"price\":163.98}";

// 1. ObjectMapper 객체 생성
ObjectMapper mapper = new ObjectMapper();

// 2. readValue(String content, Class<T> valueType)
Stock StringToObject = mapper.readValue(jsonString, Stock.class);

// print
System.out.println("CompanyName: " + StringToObject.getCompanyName());
System.out.println("Ticker: " + StringToObject.getTicker());
System.out.println("Market: " + StringToObject.getMarket());
System.out.println("Price: " + StringToObject.getPrice());

Json String To Java Object

주의

Java Object에서 기본 생성자를 생략 시 기본 생성자가 컴파일 할 경우 자동으로 생성이 되는데

만일 기본 생성자 외에 다른 생성자를 사용할 경우 기본 생성자도 꼭 선언해줍니다.

그렇지 않으면 변환 시 에러가 발생합니다. 

 

다음과 같은 에러가 발생합니다.

Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.test.api.test3.Stock` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (String)"{"companyName":"Apple Inc","ticker":"AAPL","market":"NASDAQ","price":163.98}"; line: 1, column: 2]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1764)
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1209)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:362)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3548)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3516)
at com.test.api.test3.Main2.main(Main2.java:20)

Process finished with exit code 1

 

4. Java Object To Json String

방법

1. ObjectMapper 객체 생성

2. writeValueAsString(Object value) 메소드 사용

 

Java Object To Json String 예시 1

Stock stock = new Stock("Apple Inc", "AAPL", Stock.Market.NASDAQ, 163.98);

// 1. ObjectMapper 객체 생성
ObjectMapper mapper = new ObjectMapper();

// 2. writeValueAsString(Object value)
String jsonString = mapper.writeValueAsString(stock);

// print
System.out.println(jsonString);

Java Object To Json String

 

Java Object To Json String 예시 2 (toString)

Java Object에 toString()오버라이딩 하여 활용할 수도 있습니다.

// Json String 형태로 출력 (Java Object에 추가)
@Override
public String toString() {
    ObjectMapper mapper = new ObjectMapper();
    String jsonString = null;
    try {
        jsonString = mapper.writeValueAsString(this);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return jsonString;
}
Stock stock = new Stock("Apple Inc", "AAPL", Stock.Market.NASDAQ, 163.98);
String jsonString = stock.toString();
System.out.println(jsonString);