Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menghuraikan JSON dengan Cekap dalam Pergi Tanpa Unmarshaling Berlebihan?

Bagaimanakah Saya Boleh Menghuraikan JSON dengan Cekap dalam Pergi Tanpa Unmarshaling Berlebihan?

Susan Sarandon
Lepaskan: 2024-12-29 11:27:10
asal
467 orang telah melayarinya

How Can I Efficiently Parse JSON in Go Without Redundant Unmarshaling?

Menghuraikan JSON Tanpa Pembongkaran Berlebihan dalam Go

Apabila berurusan dengan mesej JSON yang mengandungi jenis data yang berbeza, pendekatan biasa mungkin melibatkan pembongkaran data ke dalam peta generik[ string]antara muka{} untuk memeriksa kunci dan cuba menghantar nilai ke dalam struktur tertentu. Walau bagaimanapun, pendekatan ini boleh membawa kepada unmarshaling berganda yang tidak perlu.

Dalam konteks Go, terdapat penyelesaian yang lebih cekap untuk menyahmarshal sebahagian data JSON ke dalam json.RawMessage dan bukannya antara muka{}. Ini dicapai dengan mengisytiharkan peta sebagai:

var myMap map[string]json.RawMessage
Salin selepas log masuk

Apabila ia datang untuk menghantar nilai kepada struct tertentu, langkah marshaling/unmarshaling boleh dihapuskan. Sebagai contoh, dalam kes anda, anda telah menghantar ke struct "Ack" anda menggunakan:

ackjson, err := json.Marshal(v)
if err != nil {
    fmt.Println("marshal error: ", err)
}
err = json.Unmarshal(ackjson, &myAck)
if err != nil {
    fmt.Println("unmarshal error", err)
}
Salin selepas log masuk

Sebaliknya, ia boleh dipermudahkan kepada:

err = json.Unmarshal(v, &myAck)
Salin selepas log masuk

Pendekatan ini mengelakkan pembongkaran yang berlebihan langkah, menjadikan penghuraian lebih cekap.

Berikut ialah versi terkini kod anda yang menggabungkan ini pengoptimuman:

package main

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)
    }
    for k, v := range myMap {
        fmt.Printf("key: %s, value: %s \n", k, v)

        switch k {
        case "ping":
            fmt.Println(k, " is a ping", v)
        case "ack":
            fmt.Println(k, " is an ack containing a message list")
            err = json.Unmarshal(v, &myAck)
            if err != nil {
                fmt.Println("unmarshal error", err)
            } else {
                fmt.Println("New ack object: ", myAck)
            }
        default:
            fmt.Printf("%s is of a type (%T) I don't know how to handle", k, v)
        }
    }
}
Salin selepas log masuk

Dengan menggunakan json.RawMessage dan menghapuskan unmarshaling yang tidak perlu, anda boleh meningkatkan prestasi penghuraian JSON anda tanpa menjejaskan fungsi.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghuraikan JSON dengan Cekap dalam Pergi Tanpa Unmarshaling Berlebihan?. 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