
我正在处理我需要反序列化的多态类的情况.
Class Pen{ String name; List<Animal> animals;}//Animal can be an interface or parent class: I am flexibleClass 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 typecom.company.appname.utils.RuntimeTypeAdapterFactory.read(RuntimeTypeAdapterFactory.java:204)com.Google.gson.TypeAdapter.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.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”未定义所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)