jacksonの簡単な応用
Jacksonは私が使っている2番目のjsonシーケンス化ツールで、1つ目はアリのfastjsonです.
1.Jacksonのインポート
2.コアオブジェクトはObejjMapper
オブジェクトをjson文字列に変換
json文字列をオブジェクトに変換
ネストされたオブジェクトの逆シーケンス化
Jacksonは、ファイル、ストリーム、文字列など、複数のデータソースからデータを読み出し、json文字列に変換する機能を有する.
3.注記方式
@JsonProperty注記JSONマッピングに使用する属性を指定します.デフォルトでは、マッピングされたJSON属性は注記の属性名と同じですが、必要であれば、その注記のvalue値を使用してJSON属性名を変更できます.属性をjsonに対応させることができます.特定のインタフェースで返される文字列は、ラクダの名前付き@JsonIgnore属性注釈に一致しません.一部の属性を無視したシーケンス化と逆シーケンス化@JsonIgnoreProperties注釈はクラス注釈です.シーケンス化がJSONの場合、@JsonIgnoreProperties({"prop 1","prop 2"})はpro 1とpro 2の2つの属性を無視します.JSONからJavaクラスに逆シーケンス化されると、@JsonIgnoreProperties(ignoreUnknown=true)はGetterやSetterのないすべての属性を無視します.この注記はJavaクラスとJSONが完全に一致しない場合に役立ちます.@JsonIgnoreTypeもクラス注記であり、指定したタイプの属性はすべて除外されます.
Java 8は新しい日時クラスを追加し、Jacksonもこれをサポートしています.これらのサポートはJacksonモジュールとして提供されているので、まずこれらのモジュールを登録します.クラスライブラリをインポートすると、Jacksonは手動で登録する必要がなく、すべてのモジュールを自動的に検索することができます.
タイムモジュールを登録した後、コードの書き方を見てみましょう.
このとき出力されるのは
仕様に合致しない、注釈を取り消すコード
Spring Boot統合
自動設定
Spring BootのJacksonへのサポートは非常に完備しており、対応するクラスライブラリを導入すれば、Spring Bootは開梱用のBeanを自動的に構成することができます.Spring自動構成のObjectMapper(またはXmlMapper)は、基本的にほとんどの状況に適応できるように構成されています.
手動設定
Spring Bootの自動構成は非常に便利ですが、万能ではありません.必要に応じて、自動構成のBeanの代わりにBeanを手動で構成する必要があります.
そして必要な場所で依存注入を行う.ObjectMapperとXmlMapperを区別するには@Qualifier注記を使用してタグ付けする必要があることに注意してください.
1.Jacksonのインポート
com.fasterxml.jackson.core
jackson-databind
2.5.3
2.コアオブジェクトはObejjMapper
TestBean testBean = new TestBean("haha");
TestBean testBean1 = new TestBean("haha1");
System.out.println("testbean1"+testBean);
System.out.println("testbean2"+testBean1);
l.add(testBean1);
l.add(testBean);
ObjectMapper objectMapper = new ObjectMapper();
String ja = "{\"name\":\"haha\"}";
String json = objectMapper.writeValueAsString(l);
System.out.println(json);
TestBean testBean2 = objectMapper.readValue(ja, TestBean.class);
System.out.println(testBean2);
List beanList = objectMapper.readValue(json, new TypeReference>() {});
System.out.println(beanList);
オブジェクトをjson文字列に変換
String json = objectMapper.writeValueAsString(l);
[{
"name":"haha"},{
"name":"haha1"}]
json文字列をオブジェクトに変換
TestBean testBean2 = objectMapper.readValue(ja, TestBean.class);
TestBean(name=haha)
ネストされたオブジェクトの逆シーケンス化
List beanList = objectMapper.readValue(json, new TypeReference>() {});
[TestBean(name=haha), TestBean(name=haha1)]
Jacksonは、ファイル、ストリーム、文字列など、複数のデータソースからデータを読み出し、json文字列に変換する機能を有する.
3.注記方式
@JsonProperty注記JSONマッピングに使用する属性を指定します.デフォルトでは、マッピングされたJSON属性は注記の属性名と同じですが、必要であれば、その注記のvalue値を使用してJSON属性名を変更できます.属性をjsonに対応させることができます.特定のインタフェースで返される文字列は、ラクダの名前付き@JsonIgnore属性注釈に一致しません.一部の属性を無視したシーケンス化と逆シーケンス化@JsonIgnoreProperties注釈はクラス注釈です.シーケンス化がJSONの場合、@JsonIgnoreProperties({"prop 1","prop 2"})はpro 1とpro 2の2つの属性を無視します.JSONからJavaクラスに逆シーケンス化されると、@JsonIgnoreProperties(ignoreUnknown=true)はGetterやSetterのないすべての属性を無視します.この注記はJavaクラスとJSONが完全に一致しない場合に役立ちます.@JsonIgnoreTypeもクラス注記であり、指定したタイプの属性はすべて除外されます.
@JsonProperty("na")
private String name;
[{
"na":"haha"},{
"na":"haha1"}]
Java 8は新しい日時クラスを追加し、Jacksonもこれをサポートしています.これらのサポートはJacksonモジュールとして提供されているので、まずこれらのモジュールを登録します.クラスライブラリをインポートすると、Jacksonは手動で登録する必要がなく、すべてのモジュールを自動的に検索することができます.
ObjectMapper mapper = new ObjectMapper()
.registerModule(new JavaTimeModule())
.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module());
mapper.findAndRegisterModules();
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonRootName("Person")
public class Person {
@JsonProperty("Name")
private String name;
@JsonProperty("NickName")
private String nickname;
@JsonProperty("Age")
private int age;
@JsonProperty("IdentityCode")
private String identityCode;
@JsonProperty
@JsonFormat(pattern = "yyyy-MM-DD")
private LocalDate birthday;
}
タイムモジュールを登録した後、コードの書き方を見てみましょう.
static void java8DateTime() throws IOException {
Person p1 = new Person("yitian", " ", 25, "10000", LocalDate.of(1994, 1, 1));
ObjectMapper mapper = new ObjectMapper()
.registerModule(new JavaTimeModule());
//mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
String text = mapper.writeValueAsString(p1);
System.out.println(text);
Person p2 = mapper.readValue(text, Person.class);
System.out.println(p2);
}
このとき出力されるのは
{
"birthday":[1994,1,1],"Name":"yitian","NickName":" ","Age":25,"IdentityCode":"10000"}
Person(name=yitian, nickname= , age=25, identityCode=10000, birthday=1994-01-01)
仕様に合致しない、注釈を取り消すコード
{
"birthday":"1994-01-01","Name":"yitian","NickName":" ","Age":25,"IdentityCode":"10000"}
Person(name=yitian, nickname= , age=25, identityCode=10000, birthday=1994-01-01)
Spring Boot統合
自動設定
Spring BootのJacksonへのサポートは非常に完備しており、対応するクラスライブラリを導入すれば、Spring Bootは開梱用のBeanを自動的に構成することができます.Spring自動構成のObjectMapper(またはXmlMapper)は、基本的にほとんどの状況に適応できるように構成されています.
手動設定
Spring Bootの自動構成は非常に便利ですが、万能ではありません.必要に応じて、自動構成のBeanの代わりにBeanを手動で構成する必要があります.
@Configuration
public class JacksonConfig {
@Bean
@Primary
@Qualifier("xml")
public XmlMapper xmlMapper(Jackson2ObjectMapperBuilder builder) {
XmlMapper mapper = builder.createXmlMapper(true)
.build();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return mapper;
}
@Bean
@Qualifier("json")
public ObjectMapper jsonMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper mapper = builder.createXmlMapper(false)
.build();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return mapper;
}
}
そして必要な場所で依存注入を行う.ObjectMapperとXmlMapperを区別するには@Qualifier注記を使用してタグ付けする必要があることに注意してください.
@Controller
public class MainController {
private ObjectMapper jsonMapper;
private XmlMapper xmlMapper;
private Person person = new Person("yitian", 10000, LocalDate.of(1994, 1, 1));
public MainController(@Autowired @Qualifier("json") ObjectMapper jsonMapper, @Autowired @Qualifier("xml") XmlMapper xmlMapper) {
this.jsonMapper = jsonMapper;
this.xmlMapper = xmlMapper;
}