jackson delay deserializing field

后端 未结 1 500
滥情空心
滥情空心 2020-12-04 03:08

I have a class like this:

public class DeserializedHeader
    int typeToClassId;
    Object obj

I know what type of object obj is based on

相关标签:
1条回答
  • 2020-12-04 03:39

    This is really complex and painful problem. I do not know any sophisticated and elegant solution, but I can share with you my idea which I developed. I have created example program which help me to show you how you can solve your problem. At the beginning I have created two simple POJO classes:

    class Product {
    
        private String name;
    
            // getters/setters/toString
    }
    

    and

    class Entity {
    
        private long id;
    
        // getters/setters/toString
    }
    

    Example input JSON for those classes could look like this. For Product class:

    {
      "typeToClassId" : 33,
      "obj" : {
        "name" : "Computer"
      }
    }
    

    and for Entity class:

    {
      "typeToClassId" : 45,
      "obj" : {
        "id" : 10
      }
    }
    

    The main functionality which we want to use is "partial serializing/deserializing". To do this we will enable FAIL_ON_UNKNOWN_PROPERTIES feature on ObjectMapper. Now we have to create two classes which define typeToClassId and obj properties.

    class HeaderType {
    
        private int typeToClassId;
    
        public int getTypeToClassId() {
            return typeToClassId;
        }
    
        public void setTypeToClassId(int typeToClassId) {
            this.typeToClassId = typeToClassId;
        }
    
        @Override
        public String toString() {
            return "HeaderType [typeToClassId=" + typeToClassId + "]";
        }
    }
    
    class HeaderObject<T> {
    
        private T obj;
    
        public T getObj() {
            return obj;
        }
    
        public void setObj(T obj) {
            this.obj = obj;
        }
    
        @Override
        public String toString() {
            return "HeaderObject [obj=" + obj + "]";
        }
    }
    

    And, finally source code which can parse JSON:

    // Simple binding
    Map<Integer, Class<?>> classResolverMap = new HashMap<Integer, Class<?>>();
    classResolverMap.put(33, Product.class);
    classResolverMap.put(45, Entity.class);
    
    ObjectMapper mapper = new ObjectMapper();
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    
    String json = "{...}";
    
    // Parse type
    HeaderType headerType = mapper.readValue(json, HeaderType.class);
    // Retrieve class by integer value
    Class<?> clazz = classResolverMap.get(headerType.getTypeToClassId());
    // Create dynamic type
    JavaType type = mapper.getTypeFactory().constructParametricType(HeaderObject.class, clazz);
    // Parse object
    HeaderObject<?> headerObject = (HeaderObject<?>) mapper.readValue(json, type);
    // Get the object
    Object result = headerObject.getObj();
    
    System.out.println(result);
    

    Helpful links:

    1. How To Convert Java Map To / From JSON (Jackson).
    2. java jackson parse object containing a generic type object.
    0 讨论(0)
提交回复
热议问题