Java 在Google Gson中为使用ReflectTypeAdapterFactory解析的对象创建未定义的字段映射
我想创建一个Map字段,其中包含要解析的类中未定义的所有其他字段 例如,有一个jsonJava 在Google Gson中为使用ReflectTypeAdapterFactory解析的对象创建未定义的字段映射,java,gson,Java,Gson,我想创建一个Map字段,其中包含要解析的类中未定义的所有其他字段 例如,有一个json { "first": "value", "second": "value", "unknown": "value", "undefined": "value" } 一节课是 public class DaClass { @SerializedName("first") private String mFirst; @SerializedName("
{
"first": "value",
"second": "value",
"unknown": "value",
"undefined": "value"
}
一节课是
public class DaClass {
@SerializedName("first")
private String mFirst;
@SerializedName("second")
private String mSecond;
@UndefinedMap // This annotation does not exist. I've put it here for an example,
// to indicate this is not a regular Map for key "mUndefined", but
// rather a map to put unparsed fields to.
private Map<String, ?> mUndefined;
}
key="unknown" value="value"
key="undefined" value="value"
一个想法是创建一个自定义映射类型并创建与MapTypeAdapterFactory类似的TypeAdapterFactory,但它使用父类字段并从父类中排除ReflectTypeAdapterFactory
,不知道如何做,这看起来相当复杂
public class DaClass {
@SerializedName("first")
private String mFirst;
@SerializedName("second")
private String mSecond;
private UndefinedMap<String, ?> mUndefined;
}
但真正的问题是,已经有类似的支持了吗?我用Gson 2.8.2解决了这个问题,如下所示:
DaClass daClass = new Gson().fromJson(jsonString.toString(), DaClass.class);
Type type = new TypeToken<Map<String, Object>>() {}.getType();
Map<String, Object> mapOfUndefined = new Gson().fromJson(jsonString.toString(), type);
mapOfUndefined.remove("first");
mapOfUndefined.remove("second");
daClass.mUndefined = mapOfUndefined;
DaClass DaClass=new Gson().fromJson(jsonString.toString(),DaClass.class);
Type Type=new-TypeToken(){}.getType();
Map mapOfUndefined=new Gson().fromJson(jsonString.toString(),type);
mapOfUndefined.删除(“第一”);
mapOfUndefined.删除(“第二”);
daClass.munfined=mapOfUndefined;
您是否可以为DaClass
创建自定义序列化器/反序列化器?@Alexis这是可能的。我不知道如何才能实现我想要的。我还没有读过关于自定义反序列化程序的文章。如果我想知道是怎么做的,我会发布一个更新。我在想这样的事情:如果有帮助,请告诉我:-)@Alexis,这真是个好主意,但缺点是我们必须手动解析所有内容。我的对象有点复杂,它本身包含一个字段集合,例如像private List mItems
,其他类型的对象也必须反序列化为Gson对象,我希望它使用反射,这样每当我更改DaClass本身时就不必修改工厂。我花了一个小时试图实现它,这产生了大量代码和更多潜在的错误源。我认为这从一开始就是个坏主意。我需要像ReflectTypeAdapterFactory那样解析其他字段,而不需要我的代码来解析定义的字段。代码还将JsonElements放入未定义的映射。与此相反,我想要java对象,用ReflectTypeAdapterFactory解析为GoogleGSON。例如,如果值是Json整数,则值必须是java.lang.Integer;如果值是Gson Boolean,则值必须是java.lang.Boolean;如果值是JsonObject,则值必须是映射。JsonElement不允许获取值的类型。
DaClass daClass = new Gson().fromJson(jsonString.toString(), DaClass.class);
Type type = new TypeToken<Map<String, Object>>() {}.getType();
Map<String, Object> mapOfUndefined = new Gson().fromJson(jsonString.toString(), type);
mapOfUndefined.remove("first");
mapOfUndefined.remove("second");
daClass.mUndefined = mapOfUndefined;