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