Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menyahmarshal Data JSON Bukan Homogen dengan Medan \'Kod\'?

Bagaimana untuk Menyahmarshal Data JSON Bukan Homogen dengan Medan \'Kod\'?

Mary-Kate Olsen
Lepaskan: 2024-11-03 06:49:02
asal
445 orang telah melayarinya

How to Unmarshal Non-Homogenous JSON Data with a

Menyahmarshalling Non-Homogenous Data JSON

Siasatan ini berpusat di sekitar unmarshalling data JSON dengan cekap dengan memanfaatkan mekanisme yang membolehkan untuk terpilih selektif unmarshalling bahagian tertentu atau segmen. Objektifnya adalah untuk mengendalikan struktur JSON di mana bahagian pertama berfungsi sebagai "kod" yang menentukan jenis data yang terkandung dalam bahagian terakhir.

Bayangkan senario di mana anda mempunyai berbilang struktur data:

<code class="go">type Range struct {
    Start int
    End   int
}

type User struct {
    ID    int
    Pass  int
}</code>
Salin selepas log masuk

Dan mesej JSON anda mempunyai medan "kod" yang menandakan data yang ada dalam medan "muatan":

<code class="json">{
    "Code": 4,
    "Payload": {
        "Start": 1,
        "End": 10
    }
}
{
    "Code": 3,
    "Payload": {
        "ID": 1,
        "Pass": 1234
    }
}</code>
Salin selepas log masuk

Anda perlu menyahmarshal medan "muatan" ke dalam struktur data yang sesuai berdasarkan pada medan "kod".

Penyelesaian

Kunci di sini ialah menggunakan jenis json.RawMessage untuk menangguhkan penyahmarshalan medan "muatan" sehingga selepas anda tahu jenisnya. Contohnya:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Code    int
    Payload json.RawMessage // Delay parsing until we know the code
}

// Unmarshall into appropriate structures based on Code
func unmarshal(m []byte) error {
    var message Message
    err := json.Unmarshal(m, &message)
    if err != nil {
        return err
    }
    switch message.Code {
    case 3:
        var user User
        if err := json.Unmarshal(message.Payload, &user); err != nil {
            return err
        }
        fmt.Printf("Unmarshalled a User: %#v\n", user)
    case 4:
        var range Range
        if err := json.Unmarshal(message.Payload, &range); err != nil {
            return err
        }
        fmt.Printf("Unmarshalled a Range: %#v\n", range)
    default:
        return fmt.Errorf("unknown code: %d", message.Code)
    }
    return nil
}

func main() {
    json1 := []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`)
    if err := unmarshal(json1); err != nil {
        fmt.Printf("error: %v\n", err)
    }

    json2 := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
    if err := unmarshal(json2); err != nil {
        fmt.Printf("error: %v\n", err)
    }
}</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal Data JSON Bukan Homogen dengan Medan \'Kod\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan