Deserialisieren ArrayList von String mit Jackson ACCEPT_SINGLE_VALUE_AS_ARRAY
Problem Deserialisieren array als string mit Jackson 2
Dies ist ein ähnliches problem zu Deserialisieren ArrayList von String mit Jackson
Eingehende JSON (die ich nicht kontrollieren kann) hat ein element "thelist", die ein array.
Manchmal wird es jedoch als eine leere Zeichenfolge anstelle eines Arrays:
zB. statt "thelist" : [ ]
es kommt, wie "thelist" : ""
Ich habe Probleme beim Parsen beiden Fällen.
Den 'Probe.json' - Datei, die gut funktioniert:
{
"name" : "widget",
"thelist" :
[
{"height":"ht1","width":"wd1"},
{"height":"ht2","width":"wd2"}
]
}
Den Klassen:
public class Product {
private String name;
private List<Things> thelist;
//with normal getters and setters not shown
}
public class Things {
String height;
String width;
//with normal getters and setters not shown
}
Den code, der gut funktioniert:
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Test2 {
public static void main(String[] args)
{
ObjectMapper mapper = new ObjectMapper();
Product product = mapper.readValue( new File("sample.json"), Product.class);
}
}
Jedoch, wenn die JSON-hat einen leeren string statt einem array, dh. "thelist" : ""
Ich bekomme diese Fehlermeldung:
com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [collection type; class java.util.ArrayList, contains [simple type, class com.test.Things]] from JSON String; no single-String constructor/factory method (through reference chain: com.test.Product["thelist"])
Wenn ich diese Zeile hinzufügen (die Werke für Ryan in Deserialisieren ArrayList von String mit Jackson und scheinbar unterstützt durch die Dokumentation),
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
macht es keinen Unterschied.
Gibt es eine andere Einstellung oder brauche ich zum schreiben eines benutzerdefinierten deserializer?
Wenn letzteres, gibt es ein einfaches Beispiel dies zu tun, mit Jackson 2.0.4 ?
Ich bin neu in Jackson (und erste mal poster, so sanft sein). Ich habe getan, viele suchen, aber nicht finden können, ein gutes Beispiel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Problem ist, dass, obwohl single-element-zu-Array funktioniert, Sie sind immer noch versuchen, eine Konvertierung von (leer -) String in ein Objekt. Ich gehe davon aus das ist das problem, das Sie konfrontiert sind, zwar ohne Ausnahme, es ist schwer zu sagen.
Aber es gibt auch
DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
die möglicherweise den trick tun, kombiniert mit dem ersten feature. Wenn dem so ist, würden Sie einenList
mit einem einzigen "leeres Objekt", was bedeutetThings
Instanz ohne Werte.Nun ideal, was passieren soll, ist, dass, wenn Sie nur aktiviert
ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
wäre, würde das wahrscheinlich tun, was Sie wollen: null-Wert fürthelist
Eigenschaft.setThelist
- Methode, stellen Sie es nehmenjava.lang.Object
(oderJsonNode
), und dann mit den Fällen, getrennt. Für den leeren String erhalten Sie "" für nicht-leere,java.util.List
(oderArrayNode
wenn der JSON-Baum). Benötigen SieObjectMapper.convertValue
für die Inhalte, die für die eigentliche Bindung. Aber es sei denn, dies ist ein gemeinsames auftreten, ist es wahrscheinlich weniger Arbeit als eine benutzerdefinierte Sammlung deserializer.Deserializers
überschreiben-Methode genannt, zu konstruieren deserializer registriert mitModule
(einfaches Modul, nicht für die Sammlung Handler). Sie können einen Blick auf standard-Implementierungen untercom.fasterxml.jackson.databind.deser.std
-- es gibt ein paar spezielle Fälle zu unterstützen, geben Infos usw.Hallo, ich war der Lösung des ähnlichen Problems, wenn ich Objekt wie dieses
vom externen system so "param" war OBJEKT für mich, die ich versuche zu deserilize. Wenn dieses Objekt definiert wurde, im externen system funktioniert es ohne problem. Aber wenn OBJEKT "param" im externen system wurde nicht definiert, ich ein leeres ARRAY statt leeres OBJEKT
die Ursache mapping Ausnahme.
Ich löse es mit dem erstellen von benutzerdefinierte json-deserializer, die sehr gute Beispiel hier und für die Prüfung des Typs I benutzt, so etwas wie