代码之家  ›  专栏  ›  技术社区  ›  Christian Beikov

Jackson:beandserializerModifier基于接口/抽象类的反序列化

  •  0
  • Christian Beikov  · 技术社区  · 5 年前

    我需要反序列化JSON,但能够控制对象实例化。因为我需要窥视JSON对象内容来构造对象,所以我使用了一个 JsonDeserializer ,的 ValueInstantiator TreeNode ,所以我有个习惯 .

    AbstractDeserializer 无法反序列化到对象中。我正在反序列化一个接口/抽象类类型,它有getter和setter,类似于

    interface MyInterface {
      String getName();
      void setName(String name);
    }
    

    我不知道怎样才能达到我所需要的。这是我使用的代码的草图

    SimpleModule module = new SimpleModule();
    objectMapper.registerModule(module);
    module.setDeserializerModifier(new BeanDeserializerModifier() {
        @Override
        public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
            if (special.contains(beanDesc.getBeanClass())) {
                return new MyDeserializer(deserializer);
            }
            return deserializer;
        }
    });
    
    
    public class MyDeserializer extends JsonDeserializer {
        @Override
        public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            ObjectCodec codec = jsonParser.getCodec();
            JsonNode treeNode = codec.readTree(jsonParser);
            JsonNode jsonNode = treeNode.get("someAttribute");
            Object reference = //...
            jsonParser = codec.treeAsTokens(treeNode);
            jsonParser.nextToken();
            return defaultDeserializer.deserialize(jsonParser, deserializationContext, reference);
        }
    }
    

    我得到了例外

    java.lang.UnsupportedOperationException: Can not update object of type com.example.MyObject (by deserializer of type com.fasterxml.jackson.databind.deser.AbstractDeserializer)
        at com.fasterxml.jackson.databind.JsonDeserializer.deserialize(JsonDeserializer.java:126) ~[jackson-databind-2.8.8.jar:2.8.8]
        at com.example.MyDeserializer.deserialize(MyDeserializer.java) ~[classes/:na]
    
    0 回复  |  直到 5 年前