由于Realm无法处理升级类型,包括String
s,所以我正试图实现一个JsonDeserializer
,就像这个问题一样。
问题是,我对为什么会出现以下错误感到困惑:
W/系统。呃:com.google.格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN_对象,但为字符串
这是Json的一部分:标签:[GLUTEN FREE,NUT FREE],
我的RealmString:
public class RealmString extends RealmObject {
private String value;
public RealmString() {
}
public RealmString(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
改装Pojo的一部分:
public class Entity extends RealmObject {
@SerializedName("tags")
private RealmList<RealmString> tags = null;
}
以及反序列化程序:
public class StringRealmListConverter implements JsonDeserializer<RealmList<RealmString>> {
@Override
public RealmList<RealmString> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
RealmList<RealmString> realmStrings = new RealmList<>();
JsonArray ja = json.getAsJsonArray();
for (JsonElement je : ja) {
realmStrings.add((RealmString) context.deserialize(je, RealmString.class));
}
return realmStrings;
}
}
我在这里登记:
public Gson provideGson() {
return new GsonBuilder()
.registerTypeAdapter(Food.class, new FoodDeserializer())
.registerTypeAdapter(new TypeToken<RealmList<RealmString>>() {}.getType(),
new StringRealmListConverter())
.create();
}
编辑这是食物解析器。之所以如此混乱,是因为我们不得不使用构图而不是继承来取悦王国的神:
public class FoodDeserializer implements JsonDeserializer<Food> {
public static final String TAG = FoodDeserializer.class.getSimpleName();
Gson mHelperGson;
public FoodDeserializer() {
mHelperGson = new GsonBuilder().create();
}
@Override
public Food deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
String type = json.getAsJsonObject().get("responseType").getAsString();
switch (type) {
case "Platter":
return parsePlatter(json);
case "FoodItem":
return parseFoodItem(json);
default:
return null;
}
}
private PlatterEntity parsePlatter(JsonElement json) {
FoodEntity food = mHelperGson.fromJson(json, new TypeToken<FoodEntity>() {
}.getType());
ArrayList<FoodItemEntity> items = new ArrayList<>();
JsonElement je1 = json.getAsJsonObject().get("items");
if (je1 != null) {
JsonArray list = je1.getAsJsonArray();
if (list != null) {
items = mHelperGson.fromJson(list.toString(), new TypeToken<List<FoodItemEntity>>() {
}.getType());
}
}
return new PlatterEntity(food, items);
}
private FoodItemEntity parseFoodItem(JsonElement json) {
FoodEntity food = mHelperGson.fromJson(json, new TypeToken<FoodEntity>() {
}.getType());
Boolean readyToEat = null;
JsonElement je1 = json.getAsJsonObject().get("readyToEat");
if (je1 != null) {
readyToEat = je1.getAsBoolean();
}
String heatingInstructions = null;
JsonElement je2 = json.getAsJsonObject().get("heatingInstructions");
if (je2 != null) {
heatingInstructions = je2.getAsString();
}
ArrayList<IngredientEntity> ingredients = new ArrayList<>();
JsonElement je3 = json.getAsJsonObject().get("ingredients");
if (je3 != null) {
JsonArray list = je3.getAsJsonArray();
if (list != null) {
ingredients = mHelperGson.fromJson(list.toString(), new TypeToken<List<IngredientEntity>>() {
}.getType());
}
}
NutritionEntity foodNutritions = mHelperGson.fromJson(json, new TypeToken<NutritionEntity>() {
}.getType());
return new FoodItemEntity(food, readyToEat, heatingInstructions, ingredients, foodNutritions);
}
}
我想在类型适配器
上使用JsonDeserializer
,但任何帮助都将不胜感激,谢谢!
您可以使用JsonDeserializationContext
(作为反序列化
函数的第二个参数传递)来正确反序列化RealmString
。上下文
知道如何反序列化在当前Gson实例中注册的所有自定义类型。请参见JsonDeserializationContext
的文档:https://google.github.io/gson/apidocs/com/google/gson/JsonDeserializationContext.html.
它不适用于当前代码的原因是,您正在FoodDeserializer
中创建一个新的Gson实例,它不知道RealmString
的自定义反序列化程序。
原来我的感觉是对的。我必须将StringRealmListConzer
添加到FoodDeserializable
构造函数中,如下所示:
public FoodDeserializer() {
mHelperGson = new GsonBuilder()
.registerTypeAdapter(new TypeToken<RealmList<RealmString>>() {
}.getType(),
new StringRealmListConverter())
.create();
}
我正在使用gson进行改造,将json反序列化为领域对象。这在大多数情况下都很有效。处理问题时会出现麻烦 RealmList(字符串(或任何其他基本数据类型)) 由于Realm不支持RealmList,其中E不扩展Realm对象,所以我将字符串包装在RealmObject中。 我的领域对象如下 SimpleRealmObj工作正常,因为它只有字符串元素 如何反序列化stringStuff?我试过使
问题内容: 我需要转换从REST API获得的JSON数据,并将其转换为CSV以便进行分析。问题在于JSON数据不一定遵循相同的内容,因此我无法定义映射类型。这已经成为一项挑战,占用了我太多时间。我已经创建了一些代码,但是由于它在此行上引发了异常,因此它当然不起作用 错误是: 附加信息:无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型’System.Collecti
我使用Json-Jackson序列化/反序列化我的对象,并且与内置类配合得很好。 字符串、int等非常好。但是现在我必须序列化/反序列化以特定方式构建的对象。遵循声明: 如果我使用标准的序列化器/反序列化,它会向我显示一条错误消息,例如“java.lang.不支持的操作异常...”,因此它无法序列化/反序列化bobjs。 我如何以一般方式做到这一点,所以我不写3个序列化器/反序列化器,而是只告诉J
问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,我确实在“ fromJson
是否有一种简单的方法来反序列化可以是或
我有一个类,它用这个函数反序列化泛型的ArrayList,就像这个线程的第一个答案中描述的:Java抽象类函数泛型类型 Eclipse要求我强制转换TypeToken,结果如下(sinde fromJson的函数需要一个类型,而不是一个TypeToken) 结果我得到了这个错误: 在gson用户手册中,他们告诉您这是调用函数的正确方式 我看不出我做错了什么(如果它是一个有效的答案,为什么我会得到这