Мне нужно десериализовать файл 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());
}
}
Как мы видим, я использую два класса десериализации с аннотацией и один класс с простым модулем.Но работает только простой модуль, а моя аннотация не работает.
Можно ли использовать оба одновременно?