Heim  >  Artikel  >  Backend-Entwicklung  >  Teildatenbytes in eine benutzerdefinierte Struktur entpacken

Teildatenbytes in eine benutzerdefinierte Struktur entpacken

王林
王林nach vorne
2024-02-12 18:20:06463Durchsuche

Teildatenbytes in eine benutzerdefinierte Struktur entpacken

Frageninhalt

Ich habe Daten in der Form map[string][]byte, wobei Schlüssel das JSON-Feld-Tag der Struktur und Wert das Byte-Slice ist.

Betrachten Sie dieses Beispiel:

type Tweet struct {
    UserId int `json:"user_id"`
    Message string `json:"message"`
}
data = {
"user_id":<some bytes>,
"message":<some bytes>
}

var t Tweet

Wie entmarshaliere ich die entsprechenden Felddaten in eine Tweet-Struktur, die Felder jeden Typs enthalten kann, d. h. Slices/Maps/benutzerdefinierte Typen/Zeigertypen? Muss ich die Daten jedes Felds einzeln einzeln zuordnen oder gibt es eine allgemeine Möglichkeit?

Ich habe versucht, die gesamten Daten zu Marshallen und wieder in einen Strukturtyp zu entmarshallen, aber es scheint, als würde es die tatsächlichen Daten intern ändern und nicht funktionieren.

bytes, err := json.Marshal(data)
var t Tweet
err = json.Unmarshal(bytes,&t)

Workaround

Ich glaube, Sie haben Ihren Fehler nicht erwähnt, aber das Folgende hat bei mir funktioniert. Sie können dies versuchen.

package main

import (
    "encoding/json"
    "fmt"
)

type Tweet struct {
    UserId  int    `json:"user_id"`
    Message string `json:"message"`
}

func main() {
    // Example data: map of field tags to JSON-encoded byte slices
    data := map[string]json.RawMessage{
        "user_id": []byte(`123`),             // Encoded as a JSON number
        "message": []byte(`"Hello, world!"`), // Encoded as a JSON string
    }

    // Convert map to JSON
    jsonData, err := json.Marshal(data)
    if err != nil {
        fmt.Println("Error marshalling map to JSON:", err)
        return
    }

    // Unmarshal JSON into Tweet struct
    var t Tweet
    if err := json.Unmarshal(jsonData, &t); err != nil {
        fmt.Println("Error unmarshalling JSON:", err)
        return
    }

    // Output the result
    fmt.Printf("Unmarshalled: %+v\n", t)

    // Marshal the Tweet struct back into JSON
    marshalledData, err := json.Marshal(t)
    if err != nil {
        fmt.Println("Error marshalling Tweet struct to JSON:", err)
        return
    }

    // Output the marshalled JSON
    fmt.Printf("Marshalled: %s\n", marshalledData)
}

Das obige ist der detaillierte Inhalt vonTeildatenbytes in eine benutzerdefinierte Struktur entpacken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen