亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在自定義解串器中調用默認解串器不會影響實例

在自定義解串器中調用默認解串器不會影響實例

喵喵時光機 2022-12-28 10:43:15
我正在嘗試將 Json 反序列化為我進程中的現有實例。因此,如果不存在,它只會創建一個新實例。所有對象都包含一個 id 來識別它們。我使用了這個答案:https : //stackoverflow.com/a/18405958/11584969 并嘗試為此創建一個自定義反序列化器。到目前為止,我已經設法創建了一個檢查現有實例的自定義反序列化器,但我無法填充新實例或更改現有實例。我的反序列化函數是:public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {  JsonNode node = jp.getCodec().readTree(jp);  if (node instanceof NullNode) {    return null;  }  // get id from node  String strId = node.get("id").asText();  UUID id = UUID.fromString(strId);  // search for existing instance or create it  T mObject = ...  // fill/change instance  return (T) defaultDeserializer.deserialize(jp, ctxt, mObject);}對象映射器創建:ObjectMapper objectMapper = new ObjectMapper();objectMapper.enableDefaultTyping();objectMapper.registerModule(new Jdk8Module());objectMapper.registerModule(new JavaTimeModule());SimpleModule module = new SimpleModule();module.setDeserializerModifier(new BeanDeserializerModifier() {  @Override  public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {    if (beanDesc.getBeanClass() == Table.class)      return new ModelObjectDeserializer<>(Table.class, (JsonDeserializer<Table>) deserializer);    return deserializer;  }});objectMapper.registerModule(module);上面的代碼運行沒有任何錯誤或異常,但是來自 mObject 的實例沒有被 defaultDeserializer.deserialize(jp, ctxt, mObject) 填充;如果我不使用我的自定義解串器,創建的實例將按預期填充。
查看完整描述

1 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

這不是問題的答案,但我最初的目標是:


我正在嘗試將 Json 反序列化為我進程中的現有實例。因此,如果不存在,它只會創建一個新實例。所有對象都包含一個 id 來識別它們。


對于每個嘗試完成相同任務的人,以下是我的實現方式:


public class ModelInstantiator extends StdValueInstantiator {


  private static final long serialVersionUID = -7760885448565898117L;


  private Class<? extends ModelObject> clazz;


  /**

   * @param config

   * @param valueType

   */

  public ModelInstantiator(DeserializationConfig config, Class<? extends ModelObject> clazz) {

    super(config, config.constructType(clazz));


    this.clazz = clazz;

  }


  @Override

  public boolean canCreateFromObjectWith() {

    return true;

  }


  @Override

  public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) throws IOException, JsonProcessingException {

    UUID id = (UUID) args[0];


    // get local object

    ModelObject object = ...


    // if id was not found => create and add

    if (object == null) {

      try {

        object = clazz.newInstance();

      } catch (InstantiationException | IllegalAccessException e) {

        throw new IOException(e);

      }


      object.setId(id);

      // add to local list

      ...

    }


    return object;

  }


  @Override

  public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config) {

    CreatorProperty idProp = new CreatorProperty(new PropertyName("id"), config.constructType(UUID.class), null, null, null, null,

        0, null, PropertyMetadata.STD_REQUIRED);


    return new SettableBeanProperty[] { idProp };

  }


}

我不得不拆分本地和 json id。Ohterwise 數組中的 id 為空。


查看完整回答
反對 回復 2022-12-28
  • 1 回答
  • 0 關注
  • 85 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號