第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Jackson:如何讓@JsonBackReference 和自定義反序列化器同時(shí)工作?

Jackson:如何讓@JsonBackReference 和自定義反序列化器同時(shí)工作?

慕運(yùn)維8079593 2022-11-02 10:41:44
我有一個(gè) JSON 結(jié)構(gòu),其中包含字符串到對(duì)象的映射:{    "domains": {        "ldap": {            "users": {                "fwalther": {                    "firstName": "Fritz",                    "lastName": "Walther"                },                // ...            }        }    },    // ...}       我想將此結(jié)構(gòu)反序列化為使用 Jackson 的對(duì)象,Domain并且User我希望每個(gè)用戶都有一個(gè)對(duì)其映射鍵(即用戶 ID)和Domain容器的反向引用。這兩種方法都有效,但如果我嘗試同時(shí)獲取兩個(gè)反向引用,它就會(huì)失敗。@JsonManagedReference帶有和的 Java 類@JsonBackReference:public class Domain {    @JsonManagedReference    @JsonDeserialize(contentUsing = UserDeserializer.class)    private Map<String, User> users;    public Map<String, User> getUsers() {        return users;    }}public class User {    @JsonBackReference    private Domain domain;    String userId;    private String firstName;    private String lastName;    // ... getters}自定義反序列化器獲取映射鍵:public class UserDeserializer extends JsonDeserializer<User> {    @Override    public User deserialize(JsonParser p, DeserializationContext ctxt)            throws IOException, JsonProcessingException {        String key = p.getCurrentName();        User result = p.readValueAs(User.class);        result.userId = key;        return result;    }}如果我只激活其中一個(gè),這兩種機(jī)制,即@JsonManagedReference/@JsonBackReference對(duì)和自定義反序列化器都可以工作。@JsonDeserialize但是如果我結(jié)合這些機(jī)制(如上面的代碼所示),在解析 JSON 時(shí)會(huì)出現(xiàn)以下異常:查看引發(fā)異常的代碼,我發(fā)現(xiàn)我需要findBackReference在我的自定義反序列化器中實(shí)現(xiàn),但我不知道如何,我也找不到這方面的信息。有任何想法嗎?還是有其他方法可以同時(shí)獲取映射鍵和對(duì)包含對(duì)象的反向引用?
查看完整描述

1 回答

?
郎朗坤

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊

在這個(gè)答案的幫助下,我找到了解決方案:自定義反序列化器需要基于默認(rèn)反序列化器,它正確實(shí)現(xiàn)了反向引用機(jī)制。

這比僅僅從正確的基類繼承要復(fù)雜一些。相反,您需要通過(guò)自定義獲?。ㄍ耆渲玫模┠J(rèn)反序列化器實(shí)例BeanDeserializerModifier,然后將此實(shí)例傳遞給您的子類DelegatingDeserializer

public ObjectMapper getMapperWithCustomDeserializer() {

    ObjectMapper objectMapper = new ObjectMapper();


    SimpleModule module = new SimpleModule();

    module.setDeserializerModifier(new BeanDeserializerModifier() {

        @Override

        public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,

                    BeanDescription beanDesc, JsonDeserializer<?> defaultDeserializer) {

            if (beanDesc.getBeanClass() == User.class) {

                return new UserDeserializer(defaultDeserializer);

            } else {

                return defaultDeserializer;

            }

        }

    });

    objectMapper.registerModule(module);


    return objectMapper;

}

然后自定義反序列化器需要如下所示:


public class UserDeserializer extends DelegatingDeserializer {


    public UserDeserializer(JsonDeserializer<?> delegate) {

        super(delegate);

    }


    @Override

    protected JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegate) {

        return new UserDeserializer(newDelegate);

    }


    @Override

    public User deserialize(JsonParser p, DeserializationContext ctxt)

            throws IOException {

        String key = p.getCurrentName();

        User result = (User) super.deserialize(p, ctxt);


        result.userId = key;

        return result;

    }

}

最后,您需要?jiǎng)h除@JsonDeserialize注釋。然后,自定義反序列化器和@JsonBackReference應(yīng)該工作。


查看完整回答
反對(duì) 回復(fù) 2022-11-02
  • 1 回答
  • 0 關(guān)注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)