Rumah  >  Artikel  >  Java  >  Bagaimanakah saya boleh menyusun objek polimorfik dengan Gson dan memastikan semua medan disertakan dalam output JSON?

Bagaimanakah saya boleh menyusun objek polimorfik dengan Gson dan memastikan semua medan disertakan dalam output JSON?

Patricia Arquette
Patricia Arquetteasal
2024-10-30 19:27:30952semak imbas

How can I serialize polymorphic objects with Gson and ensure all fields are included in the JSON output?

Pensirian Objek Polimorfik dengan Gson

Gson menyediakan sokongan menyeluruh untuk mensiri objek polimorfik dalam format JSON. Polimorfisme timbul apabila objek mempunyai kelas asas yang dikongsi tetapi pelaksanaan yang berbeza. Untuk menyerikan objek sedemikian dengan berkesan, Gson menawarkan ciri yang dikenali sebagai RuntimeTypeAdapterFactory.

Pertimbangkan senario berikut: anda mempunyai kelas asas ObixBaseObj dan berbilang kelas anak yang diwarisi daripadanya, seperti ObixOp. Apabila mensiri objek jenis ObixBaseObj yang mengandungi objek kanak-kanak, tingkah laku lalai Gson adalah untuk hanya mensiri medan yang ditakrifkan dalam kelas asas. Ini boleh mengakibatkan pengabaian medan tertentu daripada kelas kanak-kanak.

Untuk menangani perkara ini, anda boleh menggunakan RuntimeTypeAdapterFactory. Ia membolehkan anda mendaftarkan subjenis yang berbeza di bawah penyesuai jenis tunggal. Dengan berbuat demikian, Gson boleh secara berkesan mensiri medan khusus untuk setiap subjenis, memberikan perwakilan lengkap objek polimorfik.

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

Kod di atas mendaftarkan kedua-dua subjenis ObixBaseObj dan ObixOp dengan penyesuai. Ia kemudiannya boleh disepadukan ke dalam konfigurasi Gson untuk mendayakan siri polimorfik:

<code class="java">Gson gson2=new GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create();</code>

Dengan menggunakan contoh Gson yang diubah suai ini, objek polimorfik boleh disiri dan dinyahsiri dengan berkesan, dengan tepat memelihara medan yang diwarisi daripada kelas asas dan khusus kelas kanak-kanak.

Sebagai alternatif, anda boleh melaksanakan penyelesaian yang lebih mantap dan berskala dengan memanfaatkan kelas 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>

Dalam ObixBaseObj dan kelas anaknya, anda boleh menggunakan GsonUtils untuk memastikan subjenis itu pendaftaran dilakukan secara automatik:

<code class="java">public class ObixBaseObj {
    private static final RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
            RuntimeTypeAdapterFactory.of(ObixBaseObj.class);

    private static final HashSet<Class<?>> registeredClasses= new HashSet<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>

Dengan pendekatan ini, setiap kali kejadian kelas asas atau kanak-kanak dicipta, ia akan mendaftarkan subjenisnya secara automatik dengan RuntimeTypeAdapterFactory, memastikan pensirilan menyeluruh.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menyusun objek polimorfik dengan Gson dan memastikan semua medan disertakan 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