Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Google Gson中为使用ReflectTypeAdapterFactory解析的对象创建未定义的字段映射_Java_Gson - Fatal编程技术网

Java 在Google Gson中为使用ReflectTypeAdapterFactory解析的对象创建未定义的字段映射

Java 在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("

我想创建一个Map字段,其中包含要解析的类中未定义的所有其他字段

例如,有一个json

{
    "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解决了这个问题,如下所示:

  • 将已知字段解析到类实例中(忽略未知字段)
  • 将json字符串转换为映射
  • 从该映射中删除已知字段
  • 将剩余的映射分配给类成员
  • 示例代码:

        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;