Java – transform and parse JSON

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
分享
二维码
< <上一篇
下一篇>>