Javaのライブラリjacksonの使い方

Javaのライブラリjacksonの使い方

Jackson バージョン
Jackson Core 2.10.0
Jackson Databind 2.10.0
Jackson Annotations 2.10.0

JavaでJSONを扱いたいときにjacksonというライブラリがあります。その他にもありますが、jacksonが一番メジャーかと思われます。

Jacksonライブラリのバージョンは上記の通りです。mavenやgradleで依存関係解決できますが、mavenリポジトリから直接ダウンロードすることもできます。

Group: FasterXML Jackson Core

writeValueAsStringメソッドにオブジェクトを渡すと、String型で返却され、それがJSON形式になります。

package jp.co.jackson;

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

import lombok.Getter;
import lombok.Setter;

public class SampleJackson1 {
  private static ObjectMapper mapper = new ObjectMapper();

  @Getter
  @Setter
  private String id;

  @Getter
  @Setter
  private String name;
  public static void main(String[] args) throws JsonProcessingException {
    SampleJackson1 jackson = new SampleJackson1();
    jackson.setId("1");
    jackson.setName("takahashi");

    String json = mapper.writeValueAsString(jackson);
    System.out.println(json);
  }
}

出力結果は以下の通りです。

{"id":"1","name":"takahashi"}

出力結果をキレイに整形したい場合は、mapper.enable(SerializationFeature.INDENT_OUTPUT);を設定します。

package jp.co.jackson;

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

import lombok.Getter;
import lombok.Setter;

public class SampleJackson1 {
  private static ObjectMapper mapper = new ObjectMapper();

  @Getter
  @Setter
  private String id;

  @Getter
  @Setter
  private String name;

  // コンストラクタ
  SampleJackson1() {
    mapper.enable(SerializationFeature.INDENT_OUTPUT); // これで整形される
  }

  public static void main(String[] args) throws JsonProcessingException {
    SampleJackson1 jackson = new SampleJackson1();
    jackson.setId("1");
    jackson.setName("takahashi");

    String json = mapper.writeValueAsString(jackson);
    System.out.println(json);
  }
}

出力結果は以下の通りです。

{
  "id" : "1",
  "name" : "takahashi"
}

ObjectMapper#readValueメソッドの使い方

readValueメソッドでJSON文字列をJSONオブジェクトに変換することができます。

PersonがJSONオブジェクトです。

package jp.co.jackson;

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

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

public class SampleJackson1 {
  private static ObjectMapper mapper = new ObjectMapper();

  public static void main(String[] args) throws JsonProcessingException {
    String json = "{\"id\":20,\"name\":\"takahashi\"}";

    Person person = mapper.readValue(json,Person.class);
    System.out.println(person);
  }
}
@Getter
@Setter
@ToString
class Person {
  private String id;
  private String name;
}

出力結果は以下の通りです。

Person(id=20, name=takahashi)

ListやMapを使用するときは、readValueの第二引数にTypeReferenceクラスを使用します。

package jp.co.jackson;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

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

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

public class SampleJackson1 {
  private static ObjectMapper mapper = new ObjectMapper();

  public static void main(String[] args) throws JsonProcessingException {
    String json = "[{\"id\":20,\"name\":\"takahashi\"},{\"id\":20,\"name\":\"higashiguchi\"}]";

    List<Emp> person1 = mapper.readValue(json,new TypeReference<List<Emp>>() {});
    System.out.println(person1);

    json = "{\"id\":20,\"name\":\"takahashi\"},{\"id\":20,\"name\":\"higashiguchi\"}";

    Map<String,String> person2 = mapper.readValue(json,new TypeReference<LinkedHashMap<String,String>>() {});
    System.out.println(person2);
  }
}
@Getter
@Setter
@ToString
class Emp {
  private String id;
  private String name;
}

出力結果は以下の通りです。

[Emp(id=20, name=takahashi), Emp(id=20, name=higashiguchi)]
{id=20, name=takahashi}

convertValueメソッド

EntitityやMap、ListとJSONとの変換をする場合は、ObjectMapper#convertValueメソッドを使用します。

@RequestMapping(
path = "/hoge/fuga/update",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> hoge(
@RequestHeader final HttpHeaders headers, @RequestBody final Map<String, Object> body) {
  var value = castToMap(body.get("key"));
  var list = castToList(body.get("array-key"));
  // ~
}
private Map<String, Object> castToMap(Object data) {
  return objectMapper.convertValue(data, new TypeReference<Map<String, Object>>() {});
}

private <T> List<T> castToList(Object data) {
  return objectMapper.convertValue(data, new TypeReference<List<T>>() {});
}

コメント

タイトルとURLをコピーしました