日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Jackson ObjectMapper readValue过程

發(fā)布時(shí)間:2025/3/8 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jackson ObjectMapper readValue过程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

1.整體調(diào)用棧

2.看一下調(diào)用棧的兩個(gè)方法

  ?

  

  

  resolve 方法中通過(guò) Iterator i$ = this._beanProperties.iterator() 遍歷屬性的所有子屬性,緩存對(duì)應(yīng)的 deserializer。觀察調(diào)用棧的方法,可以發(fā)現(xiàn)是循環(huán)調(diào)用的。

?

3.比如尋找自定義的 LocalDateTime類(lèi)的序列化實(shí)現(xiàn)類(lèi),看方法調(diào)用棧最上邊的方法

  

?

  如果沒(méi)有找到用戶自定義的反序列化工具,則去找默認(rèn)的標(biāo)準(zhǔn)反序列化工具

  

  

  

deser = NumberDeserializers.find(rawType, clsName);
deser = DateDeserializers.find(rawType, clsName);?

  可以看一下?com.fasterxml.jackson.databind.deser.std.DateDeserializers 和?com.fasterxml.jackson.databind.deser.std.NumberDeserializers,遍豁然開(kāi)朗。

4.加入對(duì)應(yīng)類(lèi)型序列化工具類(lèi)

import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import java.lang.reflect.Type; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import xxx.utils.json.deserializers.LocalDateDeserializer; import xxx.utils.json.deserializers.LocalDateTimeDeserializer; import xxx.utils.json.deserializers.LocalTimeDeserializer; import xxx.utils.json.serializers.BigDecimalSerializer; import xxx.utils.json.serializers.LocalDateSerializer; import xxx.utils.json.serializers.LocalDateTimeSerializer; import xxx.utils.json.serializers.LocalTimeSerializer;public class JacksonHelper {private static final SimpleModule module = initModule();private static final ObjectMapper mapper;private static final ObjectMapper prettyMapper;public JacksonHelper() {}private static SimpleModule initModule() {return (new SimpleModule()).addSerializer(BigDecimal.class, new BigDecimalSerializer()).addSerializer(LocalTime.class, new LocalTimeSerializer()).addDeserializer(LocalTime.class, new LocalTimeDeserializer()).addSerializer(LocalDate.class, new LocalDateSerializer()).addDeserializer(LocalDate.class, new LocalDateDeserializer()).addSerializer(LocalDateTime.class, new LocalDateTimeSerializer()).addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());}public static JavaType genJavaType(Type type) {return getMapper().getTypeFactory().constructType(type);}public static ObjectMapper getMapper() {return mapper;}public static ObjectMapper getPrettyMapper() {return prettyMapper;}static {mapper = (new ObjectMapper()).registerModule(module).configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true).configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);prettyMapper = mapper.copy().configure(SerializationFeature.INDENT_OUTPUT, true);} } MAPPER = JacksonHelper.getMapper().registerModule((new SimpleModule(LocalDateTimeDeserializer2.class.getName())).addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer2()));MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);

?

import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {public LocalDateTimeDeserializer() {}public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {String dateTimeStr = ((JsonNode)jp.getCodec().readTree(jp)).asText();return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);} } import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class LocalDateTimeDeserializer2 extends JsonDeserializer<LocalDateTime> {public LocalDateTimeDeserializer2() {}public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {String dateTimeStr = ((JsonNode)jp.getCodec().readTree(jp)).asText();DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");return LocalDateTime.parse(dateTimeStr, df);} }

?

  可見(jiàn),ObjectMapper registerModule 最后注冊(cè)的module會(huì)優(yōu)先被發(fā)現(xiàn)。例如上邊首先 第一個(gè) Module加入了一個(gè)LocalDateTime反序列化工具類(lèi)LocalDateTimeDeserializer,接著第二個(gè)Module加入了LocalDateTime反序列化工具類(lèi)LocalDateTimeDeserializer2,最后得到的反序列化工具類(lèi)是LocalDateTimeDeserializer2。

5.java.util.Date日期類(lèi)型解析

  日期格式:yyyy-MM-dd HH:mm:ss

  第一種方法:MAPPER.setConfig(MAPPER.getDeserializationConfig().with(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")));

  第二種方法:自定義反序列化 MAPPER.registerModule((new SimpleModule(Date.class.getName())).addDeserializer(Date.class, DateDeserializer2.dateDeserializer));

import com.fasterxml.jackson.databind.deser.std.DateDeserializers; import java.text.DateFormat; import java.text.SimpleDateFormat; public class DateDeserializer2 extends DateDeserializers.DateDeserializer{public static final DateDeserializer2 dateDeserializer = new DateDeserializer2(DateDeserializers.DateDeserializer.instance, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss");public DateDeserializer2() {}public DateDeserializer2(DateDeserializers.DateDeserializer base, DateFormat df, String formatString) {super(base, df, formatString);} }

?

  默認(rèn)的Date解析通過(guò)?DateDeserializers.DateDeserializer,時(shí)間的格式化處理是調(diào)用自己的StdDateFormat類(lèi)來(lái)實(shí)現(xiàn)日期格式化

  

  而StdDateFormat定義的格式化如下

  

  DeserializationContext中為啥可以獲取StdDateFormat(objectMapper readValue 時(shí)會(huì)創(chuàng)建DeserializationContext, 注入DeserializationConfig【包含BaseSettings(包含DateFormat)】)

  

  

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/8108488.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Jackson ObjectMapper readValue过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。