2011-05-09 6 views
1

나는 REST API에 JSON을 반환하기 위해 Jersey을 사용하고 있습니다. 클라이언트 측에서는 google-gson을 사용하고 있습니다. JSON을 비 직렬화하는 동안 다음 오류가 발생합니다.문제 : gersey를 사용하여 직렬화, gson을 사용하여 JSON 역 직렬화

com.google.gson.JsonParseException: The JsonDeserializer MapTypeAdapter failed to deserialized json object {} given the type interface java.util.Map 
     at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:63) 
     at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:88) 
     at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCustomHandler(JsonObjectDeserializationVisitor.java:116) 
     at com.google.gson.ObjectNavigator.navigateClassFields(ObjectNavigator.java:158) 
     at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:131) 
     at com.google.gson.JsonDeserializationCo 

데 뉴저지로 JSON에 연재되고있는 오브젝트 여기

public class Dealer implements Serializable 
{ 
    private String serviceURL; 
    private Map hoursService; 
    List dealerAttributes; 
} 

은 JSON이
{"serviceURL":www.google.com,"hoursService":{"3":{"dayOfWeek":3,"closeTime":"6:30 PM","openTime":"7:30 AM"},"2":{"dayOfWeek":2,"closeTime":"6:30 PM","openTime":"7:30 AM"},"1":{"dayOfWeek":1,"closeTime":"6:30 PM","openTime":"7:30 AM"}},"dealerAttributes":[{"language":"English","dealerAttributeName":"Spanish Speaking","updateDate":1174971061000},{"language":"English","updateDate":1103003316000}]} 
뉴저지

에 의해 생성되는 제네릭이 아닌 (어떤 유형을 지정하지 않았습니다)지도와 목록

이유가 무엇 일 수 있습니다. 이 문제를 해결하도록 도와주세요. gson보다 나은 유틸리티가 있습니까? 제발 제안 해주세요.

감사합니다.

+0

비슷한 질문 : http://stackoverflow.com/questions/5424263/json-decode-custom-class-with-hashmap-member-using-gson-in-java – MatrixFrog

답변

2

예제 JSON이 유효하지 않습니다. http://jsonlint.com

www.google.com은 따옴표로 묶어야합니다. 그렇다면 그것은 유효합니다. 정정 JSON으로

다음 직렬화 예제이 내가 당신이 직렬화 사용하지 않은 말했다 이해하지만 같은 붙어있는 일반적인 유형을 사용합니까

[Dealer: serviceURL=www.google.com, hoursService={ 
1=[Hours: dayOfWeek=1, closeTime=6:30 PM, openTime=7:30 AM], 
2=[Hours: dayOfWeek=2, closeTime=6:30 PM, openTime=7:30 AM], 
3=[Hours: dayOfWeek=3, closeTime=6:30 PM, openTime=7:30 AM]}, 
dealerAttributes=[ 
[DealerAttributes: language=English, dealerAttributeName=Spanish Speaking, updateDate=1174971061000], 
[DealerAttributes: language=English, dealerAttributeName=null, updateDate=1103003316000]]]
public class Foo 
{ 
    static String jsonInput = 
    "{" + 
     "\"serviceURL\":\"www.google.com\"," + 
     "\"hoursService\":" + 
     "{" + 
     "\"1\":" + 
     "{" + 
      "\"dayOfWeek\":1," + 
      "\"closeTime\":\"6:30 PM\"," + 
      "\"openTime\":\"7:30 AM\"" + 
     "}," + 
     "\"2\":" + 
     "{" + 
      "\"dayOfWeek\":2," + 
      "\"closeTime\":\"6:30 PM\"," + 
      "\"openTime\":\"7:30 AM\"" + 
     "}," + 
     "\"3\":" + 
     "{" + 
      "\"dayOfWeek\":3," + 
      "\"closeTime\":\"6:30 PM\"," + 
      "\"openTime\":\"7:30 AM\"" + 
     "}" + 
     "}," + 
     "\"dealerAttributes\":" + 
     "[" + 
     "{" + 
      "\"language\":\"English\"," + 
      "\"dealerAttributeName\":\"Spanish Speaking\"," + 
      "\"updateDate\":1174971061000" + 
     "}," + 
     "{" + 
      "\"language\":\"English\"," + 
      "\"updateDate\":1103003316000" + 
     "}" + 
     "]" + 
    "}"; 

    public static void main(String[] args) 
    { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    Gson gson = gsonBuilder.create(); 
    Dealer dealer = gson.fromJson(jsonInput, Dealer.class); 
    System.out.println(dealer); 
    } 
} 

class Dealer 
{ 
    private String serviceURL; 
    private Map<String, Hours> hoursService; 
    private List<DealerAttributes> dealerAttributes; 

    @Override 
    public String toString() 
    { 
    return String.format(
     "[Dealer: serviceURL=%1$s, hoursService=%2$s, dealerAttributes=%3$s]", 
     serviceURL, hoursService, dealerAttributes); 
    } 
} 

class Hours 
{ 
    private int dayOfWeek; 
    private String closeTime; 
    private String openTime; 

    @Override 
    public String toString() 
    { 
    return String.format(
     "[Hours: dayOfWeek=%1$d, closeTime=%2$s, openTime=%3$s]", 
     dayOfWeek, closeTime, openTime); 
    } 
} 

class DealerAttributes 
{ 
    private String language; 
    private String dealerAttributeName; 
    private long updateDate; 

    @Override 
    public String toString() 
    { 
    return String.format(
     "[DealerAttributes: language=%1$s, dealerAttributeName=%2$s, updateDate=%3$d]", 
     language, dealerAttributeName, updateDate); 
    } 
} 

출력 deserialization 때 제한 사항이 있습니까? 그렇다면 문서에서 말한 것처럼 "[w]hile deserializing, Collection must be of a specific generic type"이라는 "수동"직렬화 구문 분석을 구현해야합니다.