jacksonの簡単な応用

10793 ワード

Jacksonは私が使っている2番目のjsonシーケンス化ツールで、1つ目はアリのfastjsonです.
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;
    }