java – RuntimeTypeAdapterFactory说“type”未定义
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – RuntimeTypeAdapterFactory说“type”未定义,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2901字,纯文字阅读大概需要5分钟。
内容图文
![java – RuntimeTypeAdapterFactory说“type”未定义](/upload/InfoBanner/zyjiaocheng/788/4873a05713464e0e96d3d831bc7437db.jpg)
我正在处理我需要反序列化的多态类的情况.
Class Pen{
String name;
List<Animal> animals;
}
//Animal can be an interface or parent class: I am flexible
Class Animal{
AnimalType type;//enum
int legs;
}
enum AnimalType{
dog,cat,pig,chicken;
}
Class AnimalDog extends Animal{
//…
}
Class AnimalCat extends Animal{
//…
}
Class AnimalPig extends Animal{
//…
}
然后我创建我的Gson实例
public static Gson instanceUpperCamelCaseWithTypeAdapterFactory() {
if (null == sGsonUpperCamelCase) {
final RuntimeTypeAdapterFactory<Animal> typeFactory = RuntimeTypeAdapterFactory
.of(Animal.class, “type")
.registerSubtype(AnimalDog.class, “dog”)
.registerSubtype(AnimalCat.class, “cat”)
.registerSubtype(AnimalPig.class, “pig”);
sGsonUpperCamelCase = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.registerTypeAdapterFactory(typeFactory).create();
}//the naming policy is because server sends me upper case fields whereas Java fields are lowercase.
return sGsonUpperCamelCase;
}
为了从包含动物清单的json中获取动物,我这样做
List<Animal> animals = gson.fromJson(json, new TypeToken<List<Animal>>() {}.getType());
我完全是Gson的新手.完全.所以不要太困惑我,我怎么能解决这个问题呢?
错误跟踪:
com.google.gson.JsonParseException: cannot deserialize class com.company.appname.data.model.Animal because it does not define a field named type
com.company.appname.utils.RuntimeTypeAdapterFactory$1.read(RuntimeTypeAdapterFactory.java:204)
com.google.gson.TypeAdapter$1.read(TypeAdapter.java:199)
com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:117)
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:217)
com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
com.google.gson.Gson.fromJson(Gson.java:861)
com.google.gson.Gson.fromJson(Gson.java:826)
com.google.gson.Gson.fromJson(Gson.java:775)
我通过在线验证器运行json,没有问题.它有很多项目.我在这里展示两个.
{“Animals”:[{
“id":9,
“type”:”dog”,
“name”:”maximus”
},
{
“id":10,
“type”:”cat”,
“name”:”meowy”,
“yarns”:5,
“nice”:true
}]}
解决方法:
RuntimeTypeAdapterFactory.class
行号 – > 203
需要更换
JsonElement labelJsonElement = jsonElement.getAsJsonObject().remove(typeFieldName);
同
JsonElement labelJsonElement = jsonElement.getAsJsonObject().get(typeFieldName);
内容总结
以上是互联网集市为您收集整理的java – RuntimeTypeAdapterFactory说“type”未定义全部内容,希望文章能够帮你解决java – RuntimeTypeAdapterFactory说“type”未定义所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。