ไม่สนับสนุนการกำหนด@SerializedName
คำอธิบายประกอบหลายรายการให้กับฟิลด์ที่ Gson
เหตุผล: โดยค่าเริ่มต้น Deserialization ได้รับการจัดการด้วย LinkedHashMap และคีย์ถูกกำหนดโดยชื่อฟิลด์ของ json ขาเข้า (ไม่ใช่ชื่อฟิลด์ของคลาสที่กำหนดเองหรือ serializedNames) และมีการแม็พแบบหนึ่งต่อหนึ่ง คุณสามารถดูการดำเนินงาน (วิธี deserialization ทำงาน) ในReflectiveTypeAdapterFactory
ระดับชั้นของชั้นAdapter<T>
's read(JsonReader in)
วิธี
การแก้ไข:
คุณสามารถเขียนเองTypeAdapterซึ่งจับname
, person
และuser
แท็ก JSON และแผนที่พวกเขาไปยังเขตข้อมูลชื่อของชั้นเองของคุณ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();
}
}
กรณีทดสอบ:
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"}
ตัวอย่างเกี่ยวกับ TypeAdapters
แก้ไข 2016.04.06:ตามที่ @Mathieu Castets เขียนไว้ในคำตอบของเขาตอนนี้รองรับแล้ว (นั่นคือคำตอบที่ถูกต้องสำหรับคำถามนี้)
สตริงนามธรรมสาธารณะ []
ผลตอบแทนทางเลือก : ชื่อทางเลือกของฟิลด์เมื่อมีการ deserialized
ค่าเริ่มต้น: {}