Jackson-Deserialisierung - mit enthaltener ArrayList <T>

Schönen Tag,

Ich bin derzeit beim Integrationsversuch, einen REST-Service zu nutzen, der JSON (geschrieben in .NET) unter Verwendung von Jackson (mit Jersey) erzeugt. Der JSON besteht aus einer möglichen Fehlermeldung und einem Array von Objekten. Unten sehen Sie ein Beispiel für den JSON, der vom Jersey-Protokollierungsfilter zurückgegeben wird:

{
    "error":null,
    "object":"[{\"Id\":16,\"Class\":\"ReportType\",\"ClassID\":\"4\",\"ListItemParent_ID\":4,\"Item\":\"Pothole\",\"Description\":\"Pothole\",\"Sequence\":1,\"LastEditDate\":null,\"LastEditor\":null,\"ItemStatus\":\"Active\",\"ItemColor\":\"#00AF64\"}]"
}

Ich habe zwei Klassen, um den Typ (die äußere ListResponse) darzustellen:

public class ListResponse { 

    public String error;    
    public ArrayList<ListItem> object;  

    public ListResponse() { 
    }
}

und (das innere ListItem):

public class ListItem {
    @JsonProperty("Id")
    public int id;      
    @JsonProperty("Class")
    public String classType;
    @JsonProperty("ClassID")
    public String classId;  
    @JsonProperty("ListItemParent_ID")
    public int parentId;    
    @JsonProperty("Item")
    public String item; 
    @JsonProperty("Description")
    public String description;

    @JsonAnySetter 
    public void handleUnknown(String key, Object value) {}

    public ListItem() {
    }
}

Die Klasse, die den JSON aufruft und zurückgibt, sieht folgendermaßen aus:

public class CitizenPlusService {
    private Client client = null;   
    private WebResource service = null;     

    public CitizenPlusService() {
        initializeService("http://localhost:59105/PlusService/"); 
    }

    private void initializeService(String baseURI) {    
        // Use the default client configuration. 
        ClientConfig clientConfig = new DefaultClientConfig();      
        clientConfig.getClasses().add(JacksonJsonProvider.class);                       

        client = Client.create(clientConfig);

        // Add a logging filter to track communication between server and client. 
        client.addFilter(new LoggingFilter()); 
        // Add the base URI
        service = client.resource(UriBuilder.fromUri(baseURI).build()); 
    }

    public ListResponse getListItems(String id) throws Exception
    {           
        ListResponse response = service.path("GetListItems").path(id).accept(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_XML_TYPE).get(ListResponse.class);                                  
        return response;            
    }
}

Der wichtige Aufruf hier ist die Methode getListItems. Wenn Sie den Code in einem Test-Harness ausführen, erhalten Sie Folgendes:

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token
at [Source: java.io.StringReader@49497eb8; line: 1, column: 14] (through reference chain: citizenplus.types.ListResponse["object"])

Bitte helfen.

Viele Grüße, Carl-Peter Meyer

Antworten auf die Frage(3)

Ihre Antwort auf die Frage