Ich habe eine große JSON-Datei, die aus Strukturen besteht, die ich in POJOs zuordnen und dann in einer Sammlung speichern. Die Struktur ist ähnlich wie folgt aus:Benutzerdefinierte Jackson Deserializer, um die Zuordnung bestimmter Objekte zu vermeiden
[
{
"id": 1234,
"file": "C:\\Programs\\Program1.exe",
"exists": true
}
{
"id": 5678,
"file": "C:\\Programs\\Program2.exe",
"exists": false
}
...
]
die Jackson-Streaming-API Ich habe alle haben diese Strukturen zu lesen, und die POJOs in einer Sammlung erfolgreich gespeichert. Meine POJO Klasse sieht wie folgt aus:
public class Programs
{
@JsonProperty("id")
private Integer id;
@JsonProperty("file")
private String file;
@JsonProperty("exists")
private Boolean exists;
@JsonGetter("id")
public Integer getId()
{
return id;
}
@JsonGetter("file")
public String getFile()
{
return file;
}
@JsonGetter("exists")
public Boolean getExists()
{
return exists;
}
}
Allerdings habe ich keine Strukturen verzichten möchten, die "exists"
Satz false
während der Deserialisierung haben, so dass kein POJO jemals für sie erstellt wird. Also schrieb ich einen benutzerdefinierten Deserializer mit Hilfe dieser Frage SO [How do I call the default deserializer from a custom deserializer in Jackson], mit meiner außer Kraft gesetzt deserialize
sieht aus wie:
@Override
public Programs deserialize(JsonParser parser, DeserializationContext context)
throws IOException
{
Programs programs = (Programs)defaultDeserializer.deserialize(parser, context);
if (!programs.getExists())
{
throw context.mappingException("[exists] value is false.");
}
return programs;
}
Allerdings, wenn ich einige Unit-Tests laufen lasse, erhalte ich folgende Fehlermeldung:
"Can not deserialize instance of java.util.ArrayList out of START_OBJECT token"
message was "Class com.myprogram.serializer.ProgramsJsonDeserializer
has no default (no arg) constructor"
(Hinzufügen eines nicht arg Konstruktor erhält man die Fehlermeldung, dass StdDeserializer keinen Default-Konstruktor hat.)
Ist das der richtige Ansatz, um zu erreichen, was ich tun möchte? Und weiß jemand, warum ich diese Fehlermeldung bekomme?
Vielen Dank, das scheint der Trick! – MeanwhileInHell