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

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-03 06:49:02406semak imbas

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>

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>

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>

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!

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