Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengelakkan Double Unmarshaling Apabila Menghuraikan JSON dalam Go?

Bagaimana untuk Mengelakkan Double Unmarshaling Apabila Menghuraikan JSON dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-12-30 07:07:09
asal
1022 orang telah melayarinya

How to Avoid Double Unmarshaling When Parsing JSON in Go?

Menyahmarshalling JSON dalam Go Without Double Unmarshaling

Dalam Go, anda mungkin menghadapi situasi di mana anda perlu menghuraikan JSON ke dalam pelbagai struct, tetapi unmarshalling berganda berlaku, membawa kepada redundansi. Artikel ini membentangkan penyelesaian yang melibatkan sebahagian unmarshaling data untuk mengelakkan langkah unmarshaling kedua.

Memahami Isu

Apabila cuba menghuraikan JSON ke dalam struct yang diketahui, perkara biasa pendekatan ialah:

  1. Unmarshal JSON menjadi generik map[string]antara muka{}
  2. Cari kunci yang dijangkakan
  3. Cuba untuk menghantar nilai kepada jenis yang diingini
  4. Jika penghantaran gagal, kaji nilai sebagai JSON dan nyahmarshalkannya kepada jenis yang dikehendaki (double unmarshalling)

The Penyelesaian

Daripada menghantar nilai ke antara muka{}, seseorang boleh menyahmarshalkannya ke dalam json.RawMessage. Ini sebahagiannya menyahmarshal data dan membenarkan unmarshalling berikutnya kepada struct tertentu berdasarkan nilai utama.

Kod Contoh

import (
    "encoding/json"
    "fmt"
)

type Ping struct {
    Ping string `json:"ping"`
}

type Ack struct {
    Messages []Message `json:"messages"`
}

type Message string

func main() {
    testJSON := []byte(`{"ack":{"messages":["Hi there","Hi again"]}}`)
    var myAck = Ack{}
    var myMap map[string]json.RawMessage

    err := json.Unmarshal(testJSON, &myMap)
    if err != nil {
        fmt.Println("error unmarshalling: ", err)
    }

    jsonAck, ok := myMap["ack"]
    if !ok {
        fmt.Println("key 'ack' not found")
        return
    }

    err = json.Unmarshal(jsonAck, &myAck)
    if err != nil {
        fmt.Println("unmarshal error", err)
    } else {
        fmt.Println("New ack object: ", myAck)
    }
}
Salin selepas log masuk

Dalam kod yang diubah suai ini, kami menggantikan peta [rentetan]antara muka{} dengan peta[rentetan]json.RawMessage. Apabila mengendalikan kekunci "ack", kami menyahmarshal terus ke struct Ack, menghapuskan keperluan untuk menyahmarshal berganda.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Double Unmarshaling Apabila Menghuraikan JSON dalam Go?. 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