Rumah  >  Artikel  >  Java  >  Bagaimanakah anda menyerikan objek polimorfik dengan Gson dan mengekalkan ahli yang diwarisi dalam output JSON?

Bagaimanakah anda menyerikan objek polimorfik dengan Gson dan mengekalkan ahli yang diwarisi dalam output JSON?

Linda Hamilton
Linda Hamiltonasal
2024-10-31 21:09:02477semak imbas

How do you serialize polymorphic objects with Gson and preserve inherited members in the JSON output?

Menyerikan Objek Polimorfik dengan Gson

Gson ialah perpustakaan Java yang popular untuk menukar objek Java kepada dan dari JSON. Satu cabaran dalam mensiri objek dengan Gson ialah mengendalikan polimorfisme, di mana berbilang subkelas mewarisi daripada superclass biasa.

Masalah

Pertimbangkan senario di mana anda mempunyai hierarki kelas dengan kelas asas ObixBaseObj dan berbilang kelas yang diwarisi seperti ObixOp. Matlamatnya adalah untuk mensirikan objek kelas ini kepada JSON menggunakan Gson sambil mengekalkan ahli yang diwarisi (cth., masuk dan keluar untuk ObixOp).

Contoh GsonSerialization

<code class="java">ObixBaseObj lobbyObj = new ObixBaseObj();
lobbyObj.setIs("obix:Lobby");

ObixOp batchOp = new ObixOp();
batchOp.setName("batch");
batchOp.setIn("obix:BatchIn");
batchOp.setOut("obix:BatchOut");

lobbyObj.addChild(batchOp);

Gson gson = new Gson();
System.out.println(gson.toJson(lobbyObj));</code>

Keputusan

<code class="json">{"obix":"obj","is":"obix:Lobby","children":[{"obix":"op","name":"batch"}]}</code>

Perhatikan bahawa JSON bersiri tidak termasuk ahli ObixOp yang diwarisi (dalam dan luar).

RuntimeTypeAdapterFactory Solution

Untuk mengendalikan polimorfisme dengan anggun, Gson menyediakan ciri berkuasa yang dipanggil RuntimeTypeAdapterFactory. Kelas ini secara automatik mendaftarkan subkelas kepada superclass sepadan mereka untuk bersiri dan penyahserilan.

Pelaksanaan

<code class="java">RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
                    RuntimeTypeAdapterFactory
                   .of(ObixBaseObj.class)
                   .registerSubtype(ObixBaseObj.class)
                   .registerSubtype(ObixOp.class);


Gson gson2=new GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create();
Gson gson = new Gson();
System.out.println(gson.toJson(lobbyObj));
System.out.println("---------------------");
System.out.println(gson2.toJson(lobbyObj));</code>

Hasil

<code class="json">{"obix":"obj","is":"obix:Lobby","children":[{"obix":"op","name":"batch","children":[]}]}
---------------------
{
  "type": "ObixBaseObj",
  "obix": "obj",
  "is": "obix:Lobby",
  "children": [
    {
      "type": "ObixOp",
      "in": "obix:BatchIn",
      "out": "obix:BatchOut",
      "obix": "op",
      "name": "batch",
      "children": []
    }
  ]
}</code>

Penyelesaian ini mensiri semua ahli dengan betul, termasuk yang diwarisi oleh subkelas.

Mengendalikan Berbilang Subkelas

Dalam kes di mana terdapat berbilang subkelas, RuntimeTypeAdapter Gson menyediakan mekanisme yang mudah untuk mendaftarkannya.

  1. Buat kelas berpusat untuk mendaftarkan jenis (cth., GsonUtils):
<code class="java">public class GsonUtils {

    private static final GsonBuilder gsonBuilder = new GsonBuilder()
            .setPrettyPrinting();

    public static void registerType(
            RuntimeTypeAdapterFactory<?> adapter) {
        gsonBuilder.registerTypeAdapterFactory(adapter);
    }

    public static Gson getGson() {
        return gsonBuilder.create();
    }
}</code>
  1. Daftar penyesuai dalam subkelas:
<code class="java">public class ObixBaseObj {

    private static final RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
            RuntimeTypeAdapterFactory.of(ObixBaseObj.class);

    static {
        GsonUtils.registerType(adapter);
    }

    private synchronized void registerClass() {
        if (!registeredClasses.contains(this.getClass())) {
            registeredClasses.add(this.getClass());
            adapter.registerSubtype(this.getClass());
        }
    }

    public ObixBaseObj() {
        registerClass();
        obix = "obj";
    }
}</code>

Pendekatan ini memastikan semua subkelas didaftarkan secara automatik dengan GsonBuilder, memudahkan proses bersiri.

Atas ialah kandungan terperinci Bagaimanakah anda menyerikan objek polimorfik dengan Gson dan mengekalkan ahli yang diwarisi dalam output JSON?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn