2016-05-11 24 views
0

Ich versuche, diese XML in ein Parts Objekt deserialisieren:com.fasterxml.jackson.databind.JsonMappingException: Kann nicht Wert vom Typ instanziiert [einfachen Typ, Klasse car.Part]

<Parts> 
    <Part> 
       <Name>gearbox</Name> 
       <Year>1990</Year> 
    </Part> 
    <Part> 
       <Name>wheel</Name> 
       <Year>2000</Year> 
    </Part> 
</Parts> 

Auto .java:

package problem.car; 

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.dataformat.xml.XmlMapper; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Car { 

    public static void main(String args[]) { 
     try { 
      String xml = "<Parts>\n" 
        + " <Part>\n" 
        + "    <Name>gearbox</Name>\n" 
        + "    <Year>1990</Year>\n" 
        + " </Part>\n" 
        + " <Part>\n" 
        + "    <Name>wheel</Name>\n" 
        + "    <Year>2000</Year>\n" 
        + " </Part>\n" 
        + "</Parts>"; 
      Parts parts = (Parts) deserialize(Parts.class, xml); 
     } catch (IOException ex) { 
      Logger.getLogger(Car.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public static final Object deserialize(final Class clazz, final String xml) throws IOException { 
     ObjectMapper xmlMapper = new XmlMapper(); 
     xmlMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz")); 
     Object object; 
     try { 
      object = xmlMapper.readValue(xml, clazz); 
     } catch (com.fasterxml.jackson.databind.exc.InvalidFormatException ex) { 
      xmlMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); 
      object = xmlMapper.readValue(xml, clazz); 
     } 
     return object; 
    } 
} 

Parts.java:

package problem.car; 

import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 
import java.util.ArrayList; 
import java.util.List; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
    "Part" 
}) 
public class Parts { 

    @JsonProperty("Part") 
    private List<Part> Part = new ArrayList<>(); 

    @JsonProperty("Part") 
    public List<Part> getPart() { 
     return Part; 
    } 

    @JsonProperty("Part") 
    public void setPart(List<Part> Part) { 
     this.Part = Part; 
    } 

} 

Part.java:

package problem.car; 

import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
    "Name", 
    "Year" 
}) 
public class Part { 

    @JsonProperty("Name") 
    private String Name; 
    @JsonProperty("Year") 
    private String Year; 

    @JsonProperty("Name") 
    public String getName() { 
     return Name; 
    } 

    @JsonProperty("Name") 
    public void setName(String Name) { 
     this.Name = Name; 
    } 

    @JsonProperty("Year") 
    public String getYear() { 
     return Year; 
    } 

    @JsonProperty("Year") 
    public void setYear(String Year) { 
     this.Year = Year; 
    } 

} 

ich nichts falsch mit meinem Code sehen aber so, warum es hält mich folgendes zu geben?

com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class problem.car.Part] from String value ('gearbox'); no single-String constructor/factory method 
at [Source: [email protected]; line: 3, column: 28] (through reference chain: problem.car.Parts["Part"]->java.util.ArrayList[0]) 
+0

Haben Sie meinen Kommentar nicht gelesen "nach einigen anderen Änderungen benötigt es einen Konstruktor mit einem einzigen String-Wert" ... Auf Ihrer [alten Frage] (http://stackoverflow.com/questions/36943511/how-do -i-serialisieren-deserialisieren-csv-richtig)? –

Antwort

0

Sie müssen die Verwendung von "eingepackten" Listen deaktivieren, um die Struktur anzupassen. Dies sollte auf der README-Seite der XML-Datenformat-Github-Projektseite erläutert werden.

+0

Danke. Ich habe '@JacksonXmlElementWrapper (useWrapping = false)' über 'private List Teil = new ArrayList <>(); 'hinzugefügt, aber immer noch das Problem bekommen. Schließlich wurde festgestellt, dass '@ JsonProperty (" Part ")' über dem Getter und Setter in 'Parts' in Kleinbuchstaben' @JsonProperty ("part") 'sein musste. Irgendwelche Ideen, warum das so war? – Hooli