Nó không được hỗ trợ để xác định nhiều @SerializedName
chú thích cho một trường tại Gson.
Lý do: Theo mặc định, Deserialization được quản lý bằng một LinkedHashMap và các khóa được xác định bởi tên trường của json đến (không phải tên trường của lớp tùy chỉnh hoặc serializedNames) và có một ánh xạ 1-1. Bạn có thể thấy việc triển khai (cách deserialization hoạt động) tại phương thức của ReflectiveTypeAdapterFactory
lớp bên trong của lớp .Adapter<T>
read(JsonReader in)
Giải pháp:
Bạn có thể viết một tùy chỉnh TypeAdapter mà xử lý name
, person
và user
thẻ json và bản đồ chúng đến lĩnh vực tên của lớp tùy chỉnh của bạn 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();
}
}
Trường hợp thử nghiệm:
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"}
Ví dụ về TypeAdapters.
Chỉnh sửa 2016.04.06: Như @Mathieu Castets đã viết trong câu trả lời của mình, nó hiện được hỗ trợ. (Đó là câu trả lời chính xác cho câu hỏi này.)
public abstract String [] alternate
Trả về: tên thay thế của trường khi nó được deserialized
Mặc định: {}