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(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント