Ява Джексон хранит информацию о типе после сериализации, если переменная типа Object - PullRequest
0 голосов
/ 09 октября 2018

ClassA

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

ClassB

public class ClassB {
   private String name;
}

ClassC

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");
      }
   }
}

почему первая печать if-else "ИСТИНА" и вторая печать if-else "false" ??

Как я могу проверить тип rawData?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Мы также можем использовать @JsonTypeInfo из библиотеки Джексона для хранения информации о классе

import com.fasterxml.jackson.annotation.JsonTypeInfo;

public class ClassA {

   private String id;

   @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, property="@class")
   private Object rawData;
}

, а затем оба варианта if-else "True" .

0 голосов
/ 09 октября 2018

mapper.writeValueAsString(classA) будет сериализовать экземпляр в нечто похожее на {"rawData":{}}.

При десериализации {} преобразователь по умолчанию потерпит неудачу, поскольку он обрабатывает {} как несериализуемый тип.Если вы ранее настроили SerializationFeature.FAIL_ON_EMPTY_BEANS на false, у вас будет создан пустой Object.

Возможно, вы захотите использовать mapper.enableDefaultTyping(); для включения информации о типе в JSON и, следовательно, десериализации вправильные типы.

ПРИМЕЧАНИЕ: использование набора по умолчанию может представлять потенциальную угрозу безопасности, если входящий контент поступает из ненадежных источников, и рекомендуется, чтобы это было либо не выполнено, либо, если включено, использовалось setDefaultTyping Передача пользовательской реализации TypeResolverBuilder, которая включает в себя белые списки разрешенных типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...