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リポジトリから直接ダウンロードすることもできます。
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>>() {});
}

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^

コメント