Web 服务 - 问题:使用 Jersey 序列化,使用 gson 反序列化 JSON



我一直在使用Jersey进行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 的对象具有非泛型(未指定类型)映射和列表

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 更好吗?请指教。

谢谢。

示例 JSON 无效。 http://jsonlint.com

www.google.com 必须用引号括起来。 那么它是有效的。

更正 JSON 后,输出以下反序列化示例

[经销商: serviceURL=www.google.com, hoursService={1=[小时:星期天=1,关闭时间=下午6:30,打开时间=上午7:30],2=[小时:星期一天=2,关闭时间=下午6:30,打开时间=上午7:30],3=[小时:星期=3,关闭时间=下午6:30,打开时间=上午7:30]},经销商属性=[[经销商属性:语言=英语,经销商属性名称=西班牙语,更新日期=1174971061000],[经销商属性:语言=英语,经销商属性名称=空,更新日期=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);
  }
}

这确实使用泛型类型,我知道您说您没有使用它来序列化,但是您在反序列化时是否遇到相同的限制? 如果是这样,那么您将不得不实现一些更"手动"的反序列化解析,因为正如文档所说,"在反序列化时,集合必须是特定的泛型类型"。

最新更新