Fehler mit Jackson und Json
Ich versuche zu analysieren, einige JSON (vollständiges Beispiel für die JSON kann man in diese Gist). Ich zeige die Allgemeine Struktur der JSON-unten:
[
{
"title": "Principles of Compiler Design",
"authors": [
"Aho",
"Ullman"
],
"publisher": "Addison Wesley",
"year": 1977
},
{
"title": "Compilers: Principles Techniques and Tools",
"authors": [
"Aho",
"Sethi",
"Ullman"
],
"publisher": "Addison Wesley",
"year": 1985
}
]
Ich versuche zu Parsen von JSON mit Jackson Bibliotheken, aber ich bekomme die folgende Fehlermeldung beim testen:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
at [Source: library.json; line: 2, column: 49] (through reference chain: com.acme.datatypes.User["authors"])
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:163)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:588)
at com.fasterxml.jackson.databind.deser.std.JdkDeserializers$StringDeserializer.deserialize(JdkDeserializers.java:90)
at com.fasterxml.jackson.databind.deser.std.JdkDeserializers$StringDeserializer.deserialize(JdkDeserializers.java:59)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:336)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:89)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:290)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:112)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2563)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1759)
at com.acme.datatypes.UserTest.main(UserTest.java:20)
Hier ist mein code:
Benutzer-Test-Klasse:
public class UserTest {
public static void main(String[] args) throws JsonParseException,
JsonMappingException, IOException {
File jsonFile = new File("library.json");
User user = null;
ObjectMapper mapper = new ObjectMapper();
user = mapper.readValue(jsonFile, User.class);
System.out.println(user.getTitle());
user = mapper.readValue(jsonFile, User.class);
System.out.println(user.getAuthors());
user = mapper.readValue(jsonFile, User.class);
System.out.println(user.getPublisher());
user = mapper.readValue(jsonFile, User.class);
System.out.println(user.getYear());
}
}
User-Klasse:
public class User {
private String authors;
private String publisher;
private String title;
private Number year;
public String getAuthors() {
return this.authors;
}
public void setAuthors(String authors) {
this.authors = authors;
}
public String getPublisher() {
return this.publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
public Number getYear() {
return this.year;
}
public void setYear(Number year) {
this.year = year;
}
}
Weiß jemand was das problem sein könnte? Danke.
- kannst du die java-code, müssen Sie wandeln diese in eine Liste
- Wie haben Sie deklarieren Ihre
authors
Eigenschaft? Es sollte ein collection-oder array-Typ. - P Johny , habe ich bearbeitet das Dokument und den code Hinzugefügt, damit Sie sehen,
- können Sie bitte Blick auf den code werfen und mir sagen, wo, um es zu Bearbeiten?
- Ihre
authors
Eigenschaft kann ein string sein, weil in JSON ein array. Ändern Sie Ihren Typ aufList<String>
. - Wahrnehmung, ich bin immer diese Fehlermeldung jetzt: Kann nicht deserialisiert Instanz von com.acme.- Datentypen.Benutzer aus START_ARRAY token an [Quelle: Bibliothek.json; Zeile: 1, Spalte: 1]
- um Zeit zu sparen, habe ich geschrieben eine Antwort unten. Werfen Sie einen Blick auf Sie und sehen, ob es dir hilft.
- im immer diese Fehlermeldung nachdem, was Sie gesagt, zu tun : Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Unexpected end-of-input-innerhalb/zwischen ARRAY-Einträge [Quelle: Bibliothek.json; Zeile: 11, Spalte: 200]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zwei kurze Dinge:
Deine User-Klasse ist die Definition der
authors
Eigenschaft als String. Aber im JSON-seine ein array, so müssen Sie eine Sammlungen oder array-Typ in Ihr Java-Objekt. So etwas wie:private List<String> authors
Wiederholtes Parsen der JSON-Datei in der test-Klasse. Sie müssen nur analysieren, es einmal, und Sie brauchen, um eine obertyp (Super type Tokens, da gibt es eine Liste der Elemente in der JSON (nicht nur einer). Sie sind auch mit der falschen Art zu Deserialisieren (User.class). Statt alle diese Zeilen:
user = mapper.readValue(jsonFile, User.class);
System.out.println(user.getTitle());
user = mapper.readValue(jsonFile, User.class); //<-- unnecessary parsing
System.out.println(user.getAuthors());
user = mapper.readValue(jsonFile, User.class); //<-- unnecessary parsing
System.out.println(user.getPublisher());
user = mapper.readValue(jsonFile, User.class); //<-- unnecessary parsing
System.out.println(user.getYear());
Verwenden Sie einfach:
Sobald Sie eine Liste der Benutzer in der test-Klasse kann man iterieren Sie über eine erweiterte for-Schleife.
Da, Sie arbeiten mit einem array ist, müssen Sie es konvertieren in ein array oder eine Liste
Als Array
Als Liste
Benutzer
Verwendung: