Rumah >pembangunan bahagian belakang >Golang >Cara Mengendalikan Medan JSON yang Tidak Konsisten: Rentetan vs. Susunan Rentetan?

Cara Mengendalikan Medan JSON yang Tidak Konsisten: Rentetan vs. Susunan Rentetan?

DDD
DDDasal
2024-12-07 22:31:12628semak imbas

How to Handle Inconsistent JSON Fields: Strings vs. String Arrays?

Menyahmarshalling JSON yang Tidak Konsisten dengan Tatasusunan dan Rentetan

Menyahmarshalling JSON boleh mencabar apabila data tidak konsisten, seperti apabila medan boleh sama ada rentetan atau tatasusunan rentetan. Untuk mengendalikan senario ini, kami boleh menggunakan pelbagai strategi.

Menangkap Variasi Data Menggunakan RawMessage

Untuk medan dengan pelbagai jenis, kami boleh menggunakan json.RawMessage untuk menangkap yang tidak dihuraikan data. Ini membolehkan kami memanipulasi medan selepas menyahkarang JSON peringkat teratas.

Menyembunyikan Medan dengan Teg "-"

Untuk menyembunyikan medan "Nama Paparan" daripada penyahkodan automatik , kita boleh menggunakan tag "-" dalam definisi struct. Ini menghalang aplikasi daripada memberikan nilai pada medan itu semasa unmarshalling peringkat atas.

Menentukan Jenis Medan dan Mengisi

Setelah JSON peringkat atas dinyahkod, kami boleh memeriksa jenis medan RawDisplayName untuk menentukan sama ada ia adalah rentetan atau tatasusunan. Jika ia adalah rentetan, kami membongkarnya menjadi hirisan rentetan. Jika ia adalah tatasusunan, kami menggabungkan nilai dengan "&&" mengikut soalan asal.

Antara Muka Unmarshal Tersuai

Untuk senario dengan pelbagai medan yang berbeza-beza, ia boleh memberi manfaat untuk merangkum logik penghuraian dalam jenis tersuai yang melaksanakan antara muka json.Unmarshaler. Ini membolehkan kawalan terpusat ke atas proses penukaran data.

Contoh Pelaksanaan

Berikut ialah contoh pelaksanaan yang mengendalikan JSON yang ditentukan:

package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

type multiString string

func (ms *multiString) UnmarshalJSON(data []byte) error {
    *ms = ""
    if len(data) > 0 {
        switch data[0] {
        case '"':
            var s string
            if err := json.Unmarshal(data, &s); err != nil {
                return err
            }
            *ms = multiString(s)
        case '[':
            var s []string
            if err := json.Unmarshal(data, &s); err != nil {
                return err
            }
            *ms = multiString(strings.Join(s, "&&"))
        }
    }
    return nil
}

type MyListItem struct {
    Date           string      `json:"date"`
    DisplayName    multiString `json:"display_name"`
}

type MyListings struct {
    CLItems []MyListItem `json:"myitems"`
}

func main() {
    var listings MyListings
    err := json.Unmarshal([]byte(`{
        "date": "30 Apr",
        "display_name": "Mr Smith"
    },{
        "date": "30 Apr",
        "display_name": ["Mr Smith", "Mr Jones"]
    }`), &listings)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(listings)
}

Dengan menggunakan teknik ini, kami boleh membongkar JSON secara berkesan dengan medan pelbagai jenis, memastikan aplikasi boleh mengendalikan data dengan betul.

Atas ialah kandungan terperinci Cara Mengendalikan Medan JSON yang Tidak Konsisten: Rentetan vs. Susunan Rentetan?. 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