代码之家  ›  专栏  ›  技术社区  ›  Pratap A.K

javajackson在序列化类型Object的if变量后保留类型信息

  •  1
  • Pratap A.K  · 技术社区  · 6 年前

    public class ClassA {
       private String id;
       private Object rawData;
    }
    

    public class ClassB {
       private String name;
    }
    

    C类

    public class ClassC {
       String address;
    }
    

    主要类别

    public class MainExample {
       public static void main( String[] args ) throws IOException {
    
          ObjectMapper mapper = new ObjectMapper(  );
    
          ClassB classB = new ClassB();
          //ClassC classC = new ClassC();
          ClassA classA = new ClassA();
          classA.setRawData(  classB );
          //classA.setRawData(  classC );
    
          if (classA.getRawData() instanceof ClassB) {
             System.out.println("true ");
          } else {
             System.out.println("false");
          }
    
          String classAString = mapper.writeValueAsString( classA );
          ClassA a = mapper.readValue( classAString, ClassA.class );
    
          if (a.getRawData() instanceof ClassB) {
             System.out.println("true ");
          } else {
             System.out.println("false");
          }
       }
    }
    

    “正确” 第二,如果不是打印的话 “错误” ??

    2 回复  |  直到 6 年前
        1
  •  4
  •   Andrew    6 年前

    mapper.writeValueAsString(classA) 将实例序列化为类似 {"rawData":{}} .

    反序列化时 {} 默认映射器将失败,因为它 作为不可序列化类型。如果你已经配置了 SerializationFeature.FAIL_ON_EMPTY_BEANS false 之前,你会有一个空的 Object 创建。

    你可能想用 mapper.enableDefaultTyping();

    注意:如果传入的内容来自不受信任的源,则使用默认类型可能会带来潜在的安全风险,建议不要这样做,或者如果启用,则使用默认类型 setDefaultTyping TypeResolverBuilder 列出要使用的合法类型的实现。

        2
  •  0
  •   Pratap A.K    6 年前

    import com.fasterxml.jackson.annotation.JsonTypeInfo;
    
    public class ClassA {
    
       private String id;
    
       @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, property="@class")
       private Object rawData;
    }
    

    如果有其他指纹的话 “正确”