"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo descomponer datos JSON no homogéneos con un campo \"Código\"?

¿Cómo descomponer datos JSON no homogéneos con un campo \"Código\"?

Publicado el 2024-11-02
Navegar:487

How to Unmarshal Non-Homogenous JSON Data with a \

Desclasificación de datos JSON no homogéneos

Esta consulta se centra en la separación eficiente de datos JSON aprovechando un mecanismo que permite la separación selectiva de secciones específicas o segmentos. El objetivo es manejar estructuras JSON donde la primera parte sirve como un "código" que determina el tipo de datos contenidos en la última parte.

Imagine un escenario en el que tiene múltiples estructuras de datos:

type Range struct {
    Start int
    End   int
}

type User struct {
    ID    int
    Pass  int
}

Y su mensaje JSON tiene un campo de "código" que indica qué datos hay en el campo "carga útil":

{
    "Code": 4,
    "Payload": {
        "Start": 1,
        "End": 10
    }
}
{
    "Code": 3,
    "Payload": {
        "ID": 1,
        "Pass": 1234
    }
}

Debe descomponer el campo "carga útil" en la estructura de datos adecuada según el campo "código".

Solución

La clave Aquí se utiliza el tipo json.RawMessage para retrasar la descomposición del campo "carga útil" hasta que sepa su tipo. Por ejemplo:

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)
    }
}
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3