ããã¯ããªã«ãããããŠæžãããã®ïŒ
Jacksonã䜿ã£ãŠJSONããã·ãªã¢ã©ã€ãºããæã«ãObjectMapper#readValue
ããã䜿ãããã§ãããããããã°ãèªåã§
æžããŠããæã«List
ãMap
ãšãã£ããžã§ããªãã¯ãªåã«ãã·ãªã¢ã©ã€ãºããããšããªããªããšæãã
工倫ãèŠãããã ãªãšæããã¡ãã£ãšèª¿ã¹ãŠã¿ãããšã«ã
ãã·ãªã¢ã©ã€ãºæã«åæ å ±ãäžãã
ãŸãã¯ãObjectMapper#readValue
ïŒç¬¬2åŒæ°ãClass
ã¯ã©ã¹ã®æ¹ïŒã®JavadocãèŠãŠã¿ãŸãã
readValue(JsonParser p, Class
ããããèŠããšããããªããšãæžããŠãããŸãã
Note: this method should NOT be used if the result type is a container (Collection or Map. The reason is that due to type erasure, key and value types cannot be introspected when using this method.
çµæåãCollection
ãMap
ãšãã£ãã³ã³ããåã«ããå Žåããã®ã¡ãœããã¯äœ¿ã£ãŠã¯ãããŸããããšã
åæ å ±ããªããªãã®ã§ãããŒãå€ã®åãããããªããªãããã§ããã
ãã®ãããªæã¯ã以äžã®ã¡ãœããïŒç¬¬1åŒæ°ãString
ãªã©ã®ä»ã®ããªãšãŒã·ã§ã³ã®ãã®ãå«ããŠïŒã䜿ãã®ãè¯ãããã§ãã
readValue(JsonParser p, TypeReference
readValue(JsonParser p, JavaType valueType)
TypeReference
ã¡ãœããã®èª¬æãèŠããšãä»åã®çšéã«ã¯ãã¡ãã䜿ãã®ããŸãã¯è¯ãã®ã§ããããïŒ
Method to deserialize JSON content into a Java type, reference to which is passed as argument. Type is passed using so-called "super type token" (see ) and specifically needs to be used if the root type is a parameterized (generic) container type.
readValue(JsonParser p, TypeReference
ãã©ã¡ãŒã¿ãŒåãããã³ã³ããåãã«ãŒãåã«èŠæ±ãããå Žåããã¡ãã䜿ãããã«ãã ããã§ãã
ããã§äœ¿ããã®ãTypeReference
ã¯ã©ã¹ã§ããµãã¯ã©ã¹ãäœæããæã«åæ
å ±ãåã蟌ã¿ãŸãã
Javadocã®äŸããã§ããããããªæãã«äœ¿ããŸãã
TypeReference ref = new TypeReference<List<Integer>>() { };
ãã¡ãããObjectMapper#readValue
ã®ç¬¬2åŒæ°ã«æž¡ãã°OKã§ãã
ãããã¯ãTypeFactory
ã䜿ã£ãŠJavaType
ã«å€æããŠäœ¿ããŸãã
which can be passed to methods that accept TypeReference, or resolved using TypeFactory to obtain ResolvedType.
JavaType
ããã²ãšã€ããJavaType
ãäœ¿ãæ¹æ³ã§ããã
readValue(JsonParser p, JavaType valueType)
TypeFactory
ã䜿ã£ãŠçŽæ¥JavaType
ãçµã¿ç«ãŠãŠãããã§ãããTypeReference
ãã倿ããæ¹æ³ãããããã§ãã
â»TypeReference
ãã倿ããå ŽåããTypeFactory
ã䜿çšããŸãã
ãããªæãã«äœ¿ãããã§ãã
ObjectMapper mapper = new ObjectMaper(); JavaType stringCollection = mapper.getTypeFactory().constructCollectionType(List.class, String.class);
ã§ã¯ããããã䜿ã£ãŠãã£ãŠã¿ãŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
$ java --version openjdk 11.0.11 2021-04-20 OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04) OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing) $ mvn --version Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d) Maven home: $HOME/.sdkman/candidates/maven/current Java version: 11.0.11, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64 Default locale: ja_JP, platform encoding: UTF-8 OS name: "linux", version: "5.4.0-74-generic", arch: "amd64", family: "unix"
Mavenã§ã®äŸåé¢ä¿ãªã©ã¯ããã®ããã«å®çŸ©ã
<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.7.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.7.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.19.0</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> </plugins> </build>
åäœç¢ºèªã¯ããã¹ãã³ãŒãã§è¡ããŸãã
ãã¹ãã³ãŒãã®é圢ãšãé¡
ãã¹ãã³ãŒãã®é圢ã¯ããã¡ãã
src/test/java/org/littlewings/jackson/DeserializeJsonWithTypeTest.java
package org.littlewings.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.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; import com.fasterxml.jackson.databind.type.MapType; import com.fasterxml.jackson.databind.type.TypeFactory; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; public class DeserializeJsonWithTypeTest { // ããã«ããã¹ããæžãïŒ }
ãé¡ãšããŠã¯ã以äžã®ã¯ã©ã¹ã顿ã«ãList
ãMap
ã«æ ŒçŽããã€ã³ã¹ã¿ã³ã¹ãJSONã«ã·ãªã¢ã©ã€ãºããã·ãªã¢ã©ã€ãºãã
ãã¿ãŒã³ãããã€ã詊ããŠã¿ãããšæããŸãã
src/test/java/org/littlewings/jackson/Person.java
package org.littlewings.jackson; public class Person { String lastName; String firstName; int age; public static Person create(String lastName, String firstName, int age) { Person person = new Person(); person.setLastName(lastName); person.setFirstName(firstName); person.setAge(age); return person; } // getterïŒsetterã¯çç¥ }
List
ãŸãã¯List
ã§è©ŠããŠã¿ãŸãããã
Classãæå®ãã
æåã¯ãObjectMapper#readValue
ã«Class
ãæå®ããŠã¿ãŸãã
@Test public void nonProvideTypeAsList() throws JsonProcessingException { List<Person> persons = List.of( Person.create("磯é", "ã«ããª", 11), Person.create("ãã°ç°", "ã¿ã©ãª", 3) ); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(persons); assertThat(json).isEqualTo("[{\"lastName\":\"磯é\",\"firstName\":\"ã«ããª\",\"age\":11},{\"lastName\":\"ãã°ç°\",\"firstName\":\"ã¿ã©ãª\",\"age\":3}]"); List<Object> deserializedPersons = mapper.readValue(json, List.class); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get(0)).isNotInstanceOf(Person.class); assertThat(deserializedPersons.get(0)).isInstanceOf(LinkedHashMap.class); assertThat(deserializedPersons.get(0)).extracting("lastName").isEqualTo("磯é"); assertThat(deserializedPersons.get(0)).extracting("firstName").isEqualTo("ã«ããª"); assertThat(deserializedPersons.get(0)).extracting("age").isEqualTo(11); assertThat(deserializedPersons.get(1)).isNotInstanceOf(Person.class); assertThat(deserializedPersons.get(1)).isInstanceOf(LinkedHashMap.class); assertThat(deserializedPersons.get(1)).extracting("lastName").isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get(1)).extracting("firstName").isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get(1)).extracting("age").isEqualTo(3); }
ãã®ããã«ObjectMapper#readValue
ã®ç¬¬2åŒæ°ã«List.class
ãšãæž¡ããŠããŸããšããã®äžã«å
¥ãã®ã¯ãã®ã±ãŒã¹ã ãš
LinkedHashMap
ã®ã€ã³ã¹ã¿ã³ã¹ã«ãªããŸãã
List<Object> deserializedPersons = mapper.readValue(json, List.class); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get(0)).isNotInstanceOf(Person.class); assertThat(deserializedPersons.get(0)).isInstanceOf(LinkedHashMap.class); assertThat(deserializedPersons.get(0)).extracting("lastName").isEqualTo("磯é"); assertThat(deserializedPersons.get(0)).extracting("firstName").isEqualTo("ã«ããª"); assertThat(deserializedPersons.get(0)).extracting("age").isEqualTo(11); assertThat(deserializedPersons.get(1)).isNotInstanceOf(Person.class); assertThat(deserializedPersons.get(1)).isInstanceOf(LinkedHashMap.class); assertThat(deserializedPersons.get(1)).extracting("lastName").isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get(1)).extracting("firstName").isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get(1)).extracting("age").isEqualTo(3);
ãããªæãã«æžããŠãã³ã³ãã€ã«èªäœã¯éããŸãããList
ã«æ ŒçŽãããããŒã¿ãæ±ãæã«ãã£ã¹ãã«å€±æããŸãã
List<Person> deserializedPersons = mapper.readValue(json, List.class);
ãã¡ããããã®æã®äŸå€ã¡ãã»ãŒãžã
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.littlewings.jackson.Person (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; org.littlewings.jackson.Person is in unnamed module of loader 'app')
ããã¡ãã£ãšå ·äœçã«åãæå®ãããšããŠãããããããã§ããããã
List<LinkedHashMap<String, Object>> deserializedPersons = mapper.readValue(json, List.class);
TypeReferenceã䜿ã
次ã¯ãTypeReference
ã䜿ã£ãŠã¿ãŸãããã
@Test public void provideTypeReferenceAsList() throws JsonProcessingException { List<Person> persons = List.of( Person.create("磯é", "ã«ããª", 11), Person.create("ãã°ç°", "ã¿ã©ãª", 3) ); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(persons); assertThat(json).isEqualTo("[{\"lastName\":\"磯é\",\"firstName\":\"ã«ããª\",\"age\":11},{\"lastName\":\"ãã°ç°\",\"firstName\":\"ã¿ã©ãª\",\"age\":3}]"); List<Person> deserializedPersons = mapper.readValue(json, new TypeReference<>() { }); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get(0)).isInstanceOf(Person.class); assertThat(deserializedPersons.get(0).getLastName()).isEqualTo("磯é"); assertThat(deserializedPersons.get(0).getFirstName()).isEqualTo("ã«ããª"); assertThat(deserializedPersons.get(0).getAge()).isEqualTo(11); assertThat(deserializedPersons.get(1)).isInstanceOf(Person.class); assertThat(deserializedPersons.get(1).getLastName()).isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get(1).getFirstName()).isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get(1).getAge()).isEqualTo(3); }
ä»åã¯ãObjectMapper#readValue
ã®ç¬¬2åŒæ°ã«ãããªãTypeReference
ã®ãµãã¯ã©ã¹ãäœæããŠæž¡ããŠããŸãã
List<Person> deserializedPersons = mapper.readValue(json, new TypeReference<>() {
});
ãããšãList
ã®äžã«æ ŒçŽãããã®ãPerson
ã®ã€ã³ã¹ã¿ã³ã¹ã«ãªããŸãïŒLinkedHashMap
ã§ã¯ãªãïŒã
assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get(0)).isInstanceOf(Person.class); assertThat(deserializedPersons.get(0).getLastName()).isEqualTo("磯é"); assertThat(deserializedPersons.get(0).getFirstName()).isEqualTo("ã«ããª"); assertThat(deserializedPersons.get(0).getAge()).isEqualTo(11); assertThat(deserializedPersons.get(1)).isInstanceOf(Person.class); assertThat(deserializedPersons.get(1).getLastName()).isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get(1).getFirstName()).isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get(1).getAge()).isEqualTo(3);
JavaTypeã䜿ã
ç¶ããŠãJavaType
ã
@Test public void provideJavaTypeAsList() throws JsonProcessingException { List<Person> persons = List.of( Person.create("磯é", "ã«ããª", 11), Person.create("ãã°ç°", "ã¿ã©ãª", 3) ); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(persons); assertThat(json).isEqualTo("[{\"lastName\":\"磯é\",\"firstName\":\"ã«ããª\",\"age\":11},{\"lastName\":\"ãã°ç°\",\"firstName\":\"ã¿ã©ãª\",\"age\":3}]"); TypeFactory typeFactory = mapper.getTypeFactory(); CollectionType collectionType = typeFactory.constructCollectionType(List.class, Person.class); List<Person> deserializedPersons = mapper.readValue(json, collectionType); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get(0)).isInstanceOf(Person.class); assertThat(deserializedPersons.get(0).getLastName()).isEqualTo("磯é"); assertThat(deserializedPersons.get(0).getFirstName()).isEqualTo("ã«ããª"); assertThat(deserializedPersons.get(0).getAge()).isEqualTo(11); assertThat(deserializedPersons.get(1)).isInstanceOf(Person.class); assertThat(deserializedPersons.get(1).getLastName()).isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get(1).getFirstName()).isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get(1).getAge()).isEqualTo(3); }
ãããªæãã§ãObjectMapper
ããTypeFactory
ãååŸããŠãTypeFactory#constructãType
ã䜿ã£ãŠJavaType
ã
æ§ç¯ããŸãã
TypeFactory typeFactory = mapper.getTypeFactory(); CollectionType collectionType = typeFactory.constructCollectionType(List.class, Person.class); List<Person> deserializedPersons = mapper.readValue(json, collectionType);
constructãType
ãªã¡ãœããã¯ãé
åãã³ã¬ã¯ã·ã§ã³ãMap
ãParameticType
ãªã©ãããããããŸãã
TypeReferenceãJavaTypeã«å€æããŠäœ¿ã
æåŸã«ãTypeReference
ãJavaType
ã«å€æããŠã¿ãŸãããã
@Test public void provideTypeReferenceToJavaTypeAsList() throws JsonProcessingException { List<Person> persons = List.of( Person.create("磯é", "ã«ããª", 11), Person.create("ãã°ç°", "ã¿ã©ãª", 3) ); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(persons); assertThat(json).isEqualTo("[{\"lastName\":\"磯é\",\"firstName\":\"ã«ããª\",\"age\":11},{\"lastName\":\"ãã°ç°\",\"firstName\":\"ã¿ã©ãª\",\"age\":3}]"); TypeReference<List<Person>> typeReference = new TypeReference<>() { }; JavaType javaType = mapper.getTypeFactory().constructType(typeReference); List<Person> deserializedPersons = mapper.readValue(json, javaType); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get(0)).isInstanceOf(Person.class); assertThat(deserializedPersons.get(0).getLastName()).isEqualTo("磯é"); assertThat(deserializedPersons.get(0).getFirstName()).isEqualTo("ã«ããª"); assertThat(deserializedPersons.get(0).getAge()).isEqualTo(11); assertThat(deserializedPersons.get(1)).isInstanceOf(Person.class); assertThat(deserializedPersons.get(1).getLastName()).isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get(1).getFirstName()).isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get(1).getAge()).isEqualTo(3); }
ãããªæãã§ãTypeReference
ã®ãµãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããåŸã«ãTypeFactory#constructType
ã䜿ã£ãŠ
JavaType
ãæ§ç¯ããããšãã§ããŸãã
TypeReference<List<Person>> typeReference = new TypeReference<>() {
};
JavaType javaType = mapper.getTypeFactory().constructType(typeReference);
List<Person> deserializedPersons = mapper.readValue(json, javaType);
ã ããããäœ¿ãæ¹ã¯ããã£ãæ°ãããŸããã
Mapã§äœ¿ã
ããã²ãšã€ãMap
ã§ããªãšãŒã·ã§ã³ã詊ããŠã¿ãŸãããã
Classãæå®ãã
ãŸãã¯ãClass
ãObjectMapper#readValue
ã«æå®ãããã¿ãŒã³ã
@Test public void nonProvideTypeAsMap() throws JsonProcessingException { Map<String, Person> persons = new LinkedHashMap<>(); persons.put("katsuo", Person.create("磯é", "ã«ããª", 11)); persons.put("tarao", Person.create("ãã°ç°", "ã¿ã©ãª", 3)); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(persons); assertThat(json).isEqualTo("{\"katsuo\":{\"lastName\":\"磯é\",\"firstName\":\"ã«ããª\",\"age\":11},\"tarao\":{\"lastName\":\"ãã°ç°\",\"firstName\":\"ã¿ã©ãª\",\"age\":3}}"); Map<String, Object> deserializedPersons = mapper.readValue(json, Map.class); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get("katsuo")).isNotInstanceOf(Person.class); assertThat(deserializedPersons.get("katsuo")).isInstanceOf(LinkedHashMap.class); assertThat(deserializedPersons.get("katsuo")).extracting("lastName").isEqualTo("磯é"); assertThat(deserializedPersons.get("katsuo")).extracting("firstName").isEqualTo("ã«ããª"); assertThat(deserializedPersons.get("katsuo")).extracting("age").isEqualTo(11); assertThat(deserializedPersons.get("tarao")).isNotInstanceOf(Person.class); assertThat(deserializedPersons.get("tarao")).isInstanceOf(LinkedHashMap.class); assertThat(deserializedPersons.get("tarao")).extracting("lastName").isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get("tarao")).extracting("firstName").isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get("tarao")).extracting("age").isEqualTo(3); }
ãã¡ãã¯ãå€ãLinkedHashMap
ãªMap
ãšãªããŸãã
List<Object> deserializedPersons = mapper.readValue(json, List.class); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get(0)).isNotInstanceOf(Person.class); assertThat(deserializedPersons.get(0)).isInstanceOf(LinkedHashMap.class); assertThat(deserializedPersons.get(0)).extracting("lastName").isEqualTo("磯é"); assertThat(deserializedPersons.get(0)).extracting("firstName").isEqualTo("ã«ããª"); assertThat(deserializedPersons.get(0)).extracting("age").isEqualTo(11); assertThat(deserializedPersons.get(1)).isNotInstanceOf(Person.class); assertThat(deserializedPersons.get(1)).isInstanceOf(LinkedHashMap.class); assertThat(deserializedPersons.get(1)).extracting("lastName").isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get(1)).extracting("firstName").isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get(1)).extracting("age").isEqualTo(3);
TypeReferenceã䜿ã
TypeReference
ã䜿ã£ãå Žåã¯ããããªæãã«ã
@Test public void provideTypeReferenceAsMap() throws JsonProcessingException { Map<String, Person> persons = new LinkedHashMap<>(); persons.put("katsuo", Person.create("磯é", "ã«ããª", 11)); persons.put("tarao", Person.create("ãã°ç°", "ã¿ã©ãª", 3)); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(persons); assertThat(json).isEqualTo("{\"katsuo\":{\"lastName\":\"磯é\",\"firstName\":\"ã«ããª\",\"age\":11},\"tarao\":{\"lastName\":\"ãã°ç°\",\"firstName\":\"ã¿ã©ãª\",\"age\":3}}"); Map<String, Person> deserializedPersons = mapper.readValue(json, new TypeReference<>() { }); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get("katsuo")).isInstanceOf(Person.class); assertThat(deserializedPersons.get("katsuo").getLastName()).isEqualTo("磯é"); assertThat(deserializedPersons.get("katsuo").getFirstName()).isEqualTo("ã«ããª"); assertThat(deserializedPersons.get("katsuo").getAge()).isEqualTo(11); assertThat(deserializedPersons.get("tarao")).isInstanceOf(Person.class); assertThat(deserializedPersons.get("tarao").getLastName()).isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get("tarao").getFirstName()).isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get("tarao").getAge()).isEqualTo(3); }
List
ã®æãšåãããã«ãTypeReference
ã§Map
ã«é¢ããåæ
å ±ãæå®ããŠObjectMapper#readValue
ã«äžããããšã§ã
Map<String, Person>
ãšããŠãã·ãªã¢ã©ã€ãºã§ããŸãã
Map<String, Person> deserializedPersons = mapper.readValue(json, new TypeReference<>() { }); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get("katsuo")).isInstanceOf(Person.class); assertThat(deserializedPersons.get("katsuo").getLastName()).isEqualTo("磯é"); assertThat(deserializedPersons.get("katsuo").getFirstName()).isEqualTo("ã«ããª"); assertThat(deserializedPersons.get("katsuo").getAge()).isEqualTo(11); assertThat(deserializedPersons.get("tarao")).isInstanceOf(Person.class); assertThat(deserializedPersons.get("tarao").getLastName()).isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get("tarao").getFirstName()).isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get("tarao").getAge()).isEqualTo(3);
JavaTypeã䜿ã
JavaType
ã䜿ã£ãå Žåã
@Test public void provideJavaTypeAsMap() throws JsonProcessingException { Map<String, Person> persons = new LinkedHashMap<>(); persons.put("katsuo", Person.create("磯é", "ã«ããª", 11)); persons.put("tarao", Person.create("ãã°ç°", "ã¿ã©ãª", 3)); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(persons); assertThat(json).isEqualTo("{\"katsuo\":{\"lastName\":\"磯é\",\"firstName\":\"ã«ããª\",\"age\":11},\"tarao\":{\"lastName\":\"ãã°ç°\",\"firstName\":\"ã¿ã©ãª\",\"age\":3}}"); TypeFactory typeFactory = mapper.getTypeFactory(); MapType mapType = typeFactory.constructMapType(Map.class, String.class, Person.class); Map<String, Person> deserializedPersons = mapper.readValue(json, mapType); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get("katsuo")).isInstanceOf(Person.class); assertThat(deserializedPersons.get("katsuo").getLastName()).isEqualTo("磯é"); assertThat(deserializedPersons.get("katsuo").getFirstName()).isEqualTo("ã«ããª"); assertThat(deserializedPersons.get("katsuo").getAge()).isEqualTo(11); assertThat(deserializedPersons.get("tarao")).isInstanceOf(Person.class); assertThat(deserializedPersons.get("tarao").getLastName()).isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get("tarao").getFirstName()).isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get("tarao").getAge()).isEqualTo(3); }
Map
ã察象ãšããå Žåã¯ãTypeFactory#constructMapType
ã䜿ããŸãã
TypeFactory typeFactory = mapper.getTypeFactory(); MapType mapType = typeFactory.constructMapType(Map.class, String.class, Person.class); Map<String, Person> deserializedPersons = mapper.readValue(json, mapType);
TypeReferenceããJavaTypeã«å€æããŠäœ¿ã
æåŸã¯ãTypeReference
ããJavaType
ã«å€æããŠObjectMapper#readValue
ã«é©çšããŸãã
@Test public void provideTypeReferenceToJavaTypeAsMap() throws JsonProcessingException { Map<String, Person> persons = new LinkedHashMap<>(); persons.put("katsuo", Person.create("磯é", "ã«ããª", 11)); persons.put("tarao", Person.create("ãã°ç°", "ã¿ã©ãª", 3)); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(persons); assertThat(json).isEqualTo("{\"katsuo\":{\"lastName\":\"磯é\",\"firstName\":\"ã«ããª\",\"age\":11},\"tarao\":{\"lastName\":\"ãã°ç°\",\"firstName\":\"ã¿ã©ãª\",\"age\":3}}"); TypeReference<Map<String, Person>> typeReference = new TypeReference<>() { }; JavaType javaType = mapper.getTypeFactory().constructType(typeReference); Map<String, Person> deserializedPersons = mapper.readValue(json, javaType); assertThat(deserializedPersons).hasSize(2); assertThat(deserializedPersons.get("katsuo")).isInstanceOf(Person.class); assertThat(deserializedPersons.get("katsuo").getLastName()).isEqualTo("磯é"); assertThat(deserializedPersons.get("katsuo").getFirstName()).isEqualTo("ã«ããª"); assertThat(deserializedPersons.get("katsuo").getAge()).isEqualTo(11); assertThat(deserializedPersons.get("tarao")).isInstanceOf(Person.class); assertThat(deserializedPersons.get("tarao").getLastName()).isEqualTo("ãã°ç°"); assertThat(deserializedPersons.get("tarao").getFirstName()).isEqualTo("ã¿ã©ãª"); assertThat(deserializedPersons.get("tarao").getAge()).isEqualTo(3); }
ãã¡ãã¯List
ã®æãšåæ§ã«ãTypeFactory#constructType
ã䜿ã£ãŠTypeReference
ãå
ã«JavaType
ãæ§ç¯ããã°OKã§ãã
TypeReference<Map<String, Person>> typeReference = new TypeReference<>() {
};
JavaType javaType = mapper.getTypeFactory().constructType(typeReference);
Map<String, Person> deserializedPersons = mapper.readValue(json, javaType);
ãŸãšã
Jacksonã䜿ã£ãŠãååŒæ°ãæã£ãã¯ã©ã¹ã«ãã·ãªã¢ã©ã€ãºããæ¹æ³ãèŠãŠã¿ãŸããã
ããŸãèããããšããªãã£ãã®ãšã調ã¹ãããšããŠãã¡ãã£ãšèŠã€ãã«ããã£ãæããããã®ã§ãèªåã§ããŸãšãã€ã€
JavadocãçºããŠã¿ãŸããã
調ã¹ããšTypeReference
ã®æ¹ãæåã«èŠã€ããã®ã§ãããJavadocãèŠãŠãããšJavaType
ã®ããšã«æ°ã¥ãããããã®ã§ã
èŠè¿ããŠã¿ããšçºèŠããããŸããããšâŠã