Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 每个字段有多个GSON@SerializedName?_Java_Json_Gson - Fatal编程技术网

Java 每个字段有多个GSON@SerializedName?

Java 每个字段有多个GSON@SerializedName?,java,json,gson,Java,Json,Gson,Gson中有没有办法将多个JSON字段映射到单个Java对象成员变量 假设我有一个Java类 public class MyClass { String id; String name; } 我想将这个类与两个不同的服务一起使用。然而,这两种服务在返回数据的方式上有所不同 { "id": 2341, "person": "Bob" } 。。。而且 { "id": 5382, "user": "Mary" } 。。。分别 有没有办法将JSON字符串中的“person”和“us

Gson中有没有办法将多个JSON字段映射到单个Java对象成员变量

假设我有一个Java类

public class MyClass {
    String id;
    String name;
}
我想将这个类与两个不同的服务一起使用。然而,这两种服务在返回数据的方式上有所不同

{ "id": 2341, "person": "Bob" }
。。。而且

{ "id": 5382, "user": "Mary" }
。。。分别

有没有办法将JSON字符串中的
“person”
“user”
字段映射到Java对象中的
name
字段


(注意:我只需要将JSON字符串转换为Java对象,而不是相反的方式。)

不支持在Gson为一个字段定义多个
@SerializedName
注释

原因:默认情况下,反序列化由LinkedHashMap管理,键由传入json的字段名(而不是自定义类的字段名或序列化数据名)定义,并且存在一对一映射。您可以在
reflectTypeAdapterFactory
类的内部类
Adapter
read(JsonReader-in)
方法中看到实现(反序列化的工作方式)

解决方案: 您可以编写一个处理
name
person
user
json标记的自定义类,并将它们映射到自定义类的name字段
MyClass

class MyClassTypeAdapter extends TypeAdapter<MyClass> {

    @Override
    public MyClass read(final JsonReader in) throws IOException {
        final MyClass myClassInstance = new MyClass();

        in.beginObject();
        while (in.hasNext()) {
            String jsonTag = in.nextName();
            if ("id".equals(jsonTag)) {
                myClassInstance.id = in.nextInt();
            } else if ("name".equals(jsonTag) 
                    || "person".equals(jsonTag)
                    || "user".equals(jsonTag)) {
                myClassInstance.name = in.nextString();
            }
        }
        in.endObject();

        return myClassInstance;
    }

    @Override
    public void write(final JsonWriter out, final MyClass myClassInstance)
            throws IOException {
        out.beginObject();
        out.name("id").value(myClassInstance.id);
        out.name("name").value(myClassInstance.name);
        out.endObject();
    }
}

编辑2016.04.06:正如@Mathieu Castets在其回答中所写的,现在它得到了支持。(这是这个问题的正确答案。)

公共抽象字符串[]备选
Returns: 反序列化时的字段
默认值:{}


2015年10月,Gson版本2.4()添加了在反序列化时为
@SerializedName
使用备用/多个名称的功能。不再需要自定义类型适配器

用法:

    String jsonVal0 = "{\"id\": 5382, \"user\": \"Mary\" }";
    String jsonVal1 = "{\"id\": 2341, \"person\": \"Bob\"}";

    final GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(MyClass.class, new MyClassTypeAdapter());
    final Gson gson = gsonBuilder.create();

    MyClass myClassInstance0 = gson.fromJson(jsonVal0, MyClass.class);
    MyClass myClassInstance1 = gson.fromJson(jsonVal1, MyClass.class);

    System.out.println("jsonVal0 :" + gson.toJson(myClassInstance0));
    // output: jsonVal0 :{"id":5382,"name":"Mary"}

    System.out.println("jsonVal1 :" + gson.toJson(myClassInstance1));
    // output: jsonVal1 :{"id":2341,"name":"Bob"}
@SerializedName(value="name", alternate={"person", "user"})

对于Kotlin粉丝

@SerializedName(value="name", alternate= ["person", "user"])

对于KOTLIN,我在下面使用过,但不起作用

@SerializedName(value="name", alternate= ["person", "user"])
所以我编辑了它,在这里它工作得很好

@SerializedName(value="name", alternate= arrayOf("person", "user"))

这里是简单完美的解释这里是简单完美的解释太棒了!谢谢你的回答!当我添加alternate时,它显示了错误:java.lang.IllegalArgumentException:无法为类创建转换器,声明了多个名为的JSON字段。这是一个简单而完美的解释