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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 自定义反序列化_java – 使用类字段中指定的自定义反序列化器反序列化字符串...

發布時間:2024/4/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 自定义反序列化_java – 使用类字段中指定的自定义反序列化器反序列化字符串... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我需要編寫一個方法,它接受一些對象,一些字段名稱fieldName存在于給定對象的類中,以及一些字段值.該值是字段的

JSON序列化形式.該方法應取值并相應地反序列化,如下所示:

static void setField(Object obj, String fieldName, String value) throws Exception {

Field field = obj.getClass().getDeclaredField(fieldName)

Object valObj = objectMapper.readValue(value, field.getType());

field.set(obj, valObj);

}

(我實際上只需要檢索反序列化的值,而不是再次設置它,但這使它成為一個更好的例子.)

只要杰克遜的默認反序列化就足夠了,這就有效.現在讓我們假設我有一個帶有自定義(de)序列化器的類:

class SomeDTO {

String foo;

@JsonSerialize(using = CustomInstantSerializer.class)

@JsonDeserialize(using = CustomInstantDeserializer.class)

Instant bar;

}

一種可能的解決方案是手動檢查JsonDeserialize注釋.但是,我真的不想嘗試復制Jackson遵循的任何策略來決定使用什么序列化程序,因為它看起來很脆弱(例如全局注冊的序列化程序).

是否有一種使用DTO類中定義的字段反序列化配置來反序列化值的好方法?也許在將字段的注釋傳遞給杰克遜時將值反序列化為字段類型,這樣他們就會受到尊重?

我設法得到一個AnnotatedMember實例,它包含所有必需的信息(JSON注釋和反射字段或setter / getter-access),但無法弄清楚如何使用它來反序列化一個獨立的值到期缺乏文件:

final JavaType dtoType = objectMapper.getTypeFactory().constructType(SomeDTO.class);

final BeanDescription description = objectMapper.getDeserializationConfig().introspect(dtoType);

for (BeanPropertyDefinition propDef: beanDescription.findProperties()) {

final AnnotatedMember mutator = propertyDefinition.getNonConstructorMutator();

// now what? Also: How do I filter for the correct property?

}

最佳答案 一種可能性是序列化對象,替換給定的字段,然后再次反序列化.從/向JsonNode而不是JSON-String序列化時可以輕松完成此操作,如下所示:

static Object setField(Object obj, String fieldName, String value) throws Exception {

// note: produces a new object instead of modifying the existing one

JsonNode node = objectMapper.valueToTree(obj);

((ObjectNode) node).put(fieldName, value);

return objectMapper.readValue(node.traverse(), obj.getClass());

}

但是,為了反序列化單個字段而序列化和反序列化整個對象似乎需要很多開銷,并且可能很脆弱,因為DTO類的其他方面會影響單個字段的反序列化過程

總結

以上是生活随笔為你收集整理的java 自定义反序列化_java – 使用类字段中指定的自定义反序列化器反序列化字符串...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。