Проблема: сериализация с использованием Jersey, десериализация JSON с использованием gson - PullRequest
1 голос
/ 09 мая 2011

Я использовал Джерси для REST API и возвращал JSON.На стороне клиента я использую google-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 Джерси, имеет неуниверсальный (не указан тип) Map и List

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?Пожалуйста, предложите.

Спасибо.

1 Ответ

2 голосов
/ 01 июня 2011

Пример 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);
  }
}

При этом используются универсальные типы, которые, как я понимаю, вы сказали, что вы не использовали длясериализуйте, но вы застряли с тем же ограничением при десериализации?Если это так, то вам придется реализовать еще один «ручной» анализ десериализации, потому что, как говорят в документах, «[w] hile deserializing, Collection должен иметь определенный универсальный тип» .

...