Java – transform and parse JSON
•
Java
I'm using retrofit with Jackson For some reason, I cannot resolve the following JSON:
[ { "ProfileImage": null,"UserName": "joe" },{ "ProfileImage": "http://www.example.com/profiles/fileName1.jpg","UserName": "jane" },{ "ProfileImage": null,"UserName": "john" } ]
I get this 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)
My code is as follows:
// File:Test. java:
public class Test { public static void main(String[] 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<ListingReplyExt> replies = listingService.getReplies(123,1,10); //More code... }
}
// File:ListingService. java
public interface ListingService { @GET("/api/ListingRepliesService.svc/Get") public ArrayList<ListingReplyExt> getReplies( @Query("listingId") long listingId,@Query("start") int start,@Query("count") int count); }
// File:ListingReplyExt. java:
@JsonIgnoreProperties(ignoreUnkNown = true) public class ListingReplyExt { private String profileImage; private String username; @JsonProperty(value = "ProfileImage") public String getProfileImage() { return profileImage; } @JsonProperty(value = "ProfileImage") public void setProfileImage(String profileImage) { this.profileImage = profileImage; } @JsonProperty(value = "UserName") public String getUsername() { return username; } @JsonProperty(value = "UserName") public void setUsername(String username) { this.username = username; } }
Any help is legal
UPDATE
Sotirios delimanolis's comments gave me some tips to solve this problem
My Jackson converter used to be like this:
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<Object>) type); } //More code }
I changed to:
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 }
Now it applies to me
Solution
Use square's converter to add it to your build In gradle:
compile 'com.squareup.retrofit:converter-jackson:1.9.0'
After that, you can use the Setconverter (the new Jackson converter ()) is added to the restadapter builder to activate it
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码