Это способ использовать сочетание Аннотации и Простого модуля для десериализации? - PullRequest
0 голосов
/ 05 июня 2019

Мне нужно десериализовать файл json с 3 различными свойствами.

Редактировать: Или, как я могу десериализовать List<User> optional and mandatory в AudienceDeserialization, (неизвестный размер)

Audiance Classe:

public class Audience {
    Entity entity;
    private Integer stageBor;
    @JsonDeserialize(using = MandatoryDeserialize.class)
    private List<User> mandatory;
    @JsonDeserialize(using = OptionalDeserialize.class)
    private List<User> optional;
// ....

Json файл

[
  {
    "entity": "BFA",
    "stageBor": "1",
    "mandatory": [
        { "email": "11test@test.com"},
        { "email": "11test@test.com"}
    ],
    "optional": [
        { "email": "12test@test.com"},
        { "email": "12test@test.com"},
        { "email": "12test@test.com"},
        { "email": "12test@test.com"}
    ]
  },
    {
    "entity": "EX",
    "stageBor": "2",
    "mandatory": [
         { "email": "21test@test.com"},
        { "email": "21test@test.com"},
        { "email": "21test@test.com"}
    ],
    "optional": [
        { "email": "22test@test.com"},
        { "email": "22test@test.com"},
        { "email": "22test@test.com"}
    ]

  },
  {
    "entity": "IT",
    "stageBor": "3",
    "mandatory": [
         { "email": "31test@test.com"},
        { "email": "31test@test.com"},
        { "email": "31test@test.com"}
    ],
    "optional": [
         { "email": "33test@test.com"},
        { "email": "33test@test.com"},
        { "email": "33test@test.com"}
    ]
  }
]

ОбязательныйDeserialize

public class MandatoryDeserialize extends JsonDeserializer<List<User>> {

    @Override
    public List<User> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, IOException {
        InnerItems innerItems = jp.readValueAs(InnerItems.class);

        return innerItems. mandatory;
    }

    private static class InnerItems {
        public List<User>  mandatory;
    }
}

НеобязательныйDeserialize

public class OptionalDeserialize extends JsonDeserializer<List<User>> {
    @Override
    public List<User> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, IOException {
        InnerItems innerItems = jp.readValueAs(InnerItems.class);

        return innerItems.optional;
    }

    private static class InnerItems {
        public List<User> optional;
    }

АудиторияDeserialization

public class AudienceDeserialization extends StdDeserializer<Audience> {

    public AudienceDeserialization() {
        this(null);
    }
    private AudienceDeserialization(Class<?> vc)
    {
        super(vc);
    }

    public Audience deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        JsonNode node = jp.getCodec().readTree(jp);
        Entity entity = new Entity();
        String nameEntity = node.get("entity").asText();
        entity = entity.searchEntity(ListEntities.entities,nameEntity);
        Integer stageBor =  node.get("stageBor").asInt();
       // String email = node.get("email").asText();

        return new Audience(entity,stageBor, null, null);


MAIN

   public static void main(String[] args) throws FileNotFoundException {
        com.fasterxml.jackson.databind.ObjectMapper mapper = new ObjectMapper();
        mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Audience.class, new AudienceDeserialization());
        mapper.registerModule(module);

        TypeReference<List<Audience>> typeReferenceAudience = new TypeReference<>() {};
        FileInputStream inputStreamAudience = new FileInputStream("C:\\Users\\oraph\\Desktop\\audience.json");
        try {
            List<Audience> audiences = mapper.readValue(inputStreamAudience, typeReferenceAudience);

            System.out.println("Users Saved!");
        } catch (IOException e) {
            System.out.println("Unable to save users: " + e.getMessage());
        }
    }

Как мы видим, я использую два класса десериализации с аннотацией и один класс с простым модулем.Но работает только простой модуль, а моя аннотация не работает.

Можно ли использовать оба одновременно?

...