Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menstrim Dekod Tatasusunan JSON Besar-besaran untuk Mengelakkan Isu Memori?

Bagaimanakah Saya Boleh Menstrim Dekod Tatasusunan JSON Besar-besaran untuk Mengelakkan Isu Memori?

Susan Sarandon
Susan Sarandonasal
2024-12-17 10:48:25372semak imbas

How Can I Stream Decode Massive JSON Arrays to Avoid Memory Issues?

Penstriman Penyahkodan Tatasusunan JSON Besar-besaran

Mendapatkan semula tatasusunan JSON yang besar daripada fail boleh menjadi intensif memori apabila menggunakan Unmarshal, kerana ia memuatkan keseluruhan data ke dalam ingatan sekaligus. Untuk menangani perkara ini, kami boleh memanfaatkan teknik penstriman untuk memproses elemen tatasusunan mengikut elemen.

Contoh Menggunakan Penyahkod Strim

Pakej pengekodan/json menyediakan penyelesaian untuk penstriman JSON pemprosesan. Berikut ialah contoh lanjutan daripada dokumentasi pakej:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "strings"
)

func main() {
    const jsonStream = `
                [
                    {"Name": "Ed", "Text": "Knock knock."},
                    {"Name": "Sam", "Text": "Who's there?"},
                    {"Name": "Ed", "Text": "Go fmt."},
                    {"Name": "Sam", "Text": "Go fmt who?"},
                    {"Name": "Ed", "Text": "Go fmt yourself!"}
                ]
            `
    type Message struct {
        Name, Text string
    }
    dec := json.NewDecoder(strings.NewReader(jsonStream))

    // read open bracket
    t, err := dec.Token()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%T: %v\n", t, t)

    // while the array contains values
    for dec.More() {
        var m Message
        // decode an array value (Message)
        err := dec.Decode(&m)
        if err != nil {
            log.Fatal(err)
        }

        fmt.Printf("%v: %v\n", m.Name, m.Text)
    }

    // read closing bracket
    t, err = dec.Token()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%T: %v\n", t, t)

}

Dalam contoh ini, kami mencipta penyahkod strim (dec) dan menggunakan dec.More() dalam gelung untuk lelaran melalui elemen tatasusunan. Setiap mesej dinyahkod dan kandungannya dicetak tanpa memuatkan keseluruhan tatasusunan ke dalam memori.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menstrim Dekod Tatasusunan JSON Besar-besaran untuk Mengelakkan Isu Memori?. 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