Rénovation et Jackson et parsing JSON

J’utilise Retrofit avec Jackson. Pour certaines raisons, je ne peux pas parsingr le JSON suivant:

[ { "ProfileImage": null, "UserName": "joe" }, { "ProfileImage": "http://www.example.com/profiles/fileName1.jpg", "UserName": "jane" }, { "ProfileImage": null, "UserName": "john" } ] 

Je reçois cette exception:

 Exception in thread "main" retrofit.RetrofitError: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class at retrofit.RetrofitError.unexpectedError(RetrofitError.java:41) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:294) at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:182) at com.sun.proxy.$Proxy5.getReplies(Unknown Source) at Test.main(Test.java:25) Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class at JacksonConverter.fromBody(JacksonConverter.java:27) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:274) 

Mon code est le suivant:

// Fichier: Test.java:

 public class Test { public static void main(Ssortingng[] args) { ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(new PropertyNamingStrategy .PascalCaseStrategy()); RestAdapter restAdapter = new RestAdapter.Builder() .setServer("http://www.example.com") .setConverter(new JacksonConverter(mapper)) .build(); ListingService listingService = restAdapter.create(ListingService.class); ArrayList replies = listingService.getReplies(123, 1, 10); //More code... } 

}

// Fichier: ListingService.java

 public interface ListingService { @GET("/api/ListingRepliesService.svc/Get") public ArrayList getReplies( @Query("listingId") long listingId, @Query("start") int start, @Query("count") int count); } 

// Fichier: ListingReplyExt.java:

 @JsonIgnoreProperties(ignoreUnknown = true) public class ListingReplyExt { private Ssortingng profileImage; private Ssortingng username; @JsonProperty(value = "ProfileImage") public Ssortingng getProfileImage() { return profileImage; } @JsonProperty(value = "ProfileImage") public void setProfileImage(Ssortingng profileImage) { this.profileImage = profileImage; } @JsonProperty(value = "UserName") public Ssortingng getUsername() { return username; } @JsonProperty(value = "UserName") public void setUsername(Ssortingng username) { this.username = username; } } 

Toute aide est appréciée.

METTRE À JOUR

Le commentaire de Sotirios Delimanolis m’a donné quelques astuces pour résoudre ce problème.

Mon JacksonConverter était à l’origine ceci:

 public class JacksonConverter implements Converter { private final ObjectMapper objectMapper; public JacksonConverter(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Override public Object fromBody(TypedInput body, Type type) { return objectMapper.readValue(body.in(), (Class) type); } //More code } 

Je l’ai changé en ceci:

 public class JacksonConverter implements Converter { private final ObjectMapper objectMapper; public JacksonConverter(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Override public Object fromBody(TypedInput body, Type type) { JavaType javaType = objectMapper.getTypeFactory().constructType(type); return objectMapper.readValue(body.in(), javaType); } //More code } 

Maintenant cela fonctionne pour moi.

Utilisez le convertisseur de Square en ajoutant ceci à votre build.gradle:

 comstack 'com.squareup.retrofit:converter-jackson:1.9.0' 

Ensuite, vous pouvez l’activer en ajoutant .setConverter(new JacksonConverter()) à votre générateur RestAdapter .