Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mencegah `` Melarikan diri Semasa JSON Marshaling dalam Go?

Bagaimana untuk Mencegah `` Melarikan diri Semasa JSON Marshaling dalam Go?

Linda Hamilton
Lepaskan: 2024-12-21 10:33:14
asal
376 orang telah melayarinya

How to Prevent `` Escaping During JSON Marshaling in Go?

Mengatasi Halangan Pengekodan: Menekan < dan > Melarikan diri dalam json.Marshal

Pengenalan

Apabila berurusan dengan data dalam format JSON, kadangkala perlu mengekalkan aksara tertentu, seperti < dan >, sebagai sebahagian daripada rentetan yang dikodkan. Walau bagaimanapun, json.Marshal, fungsi pustaka Go lalai untuk menukar objek kepada rentetan JSON, secara automatik melepaskan aksara ini untuk mengelakkan potensi kelemahan keselamatan. Ini boleh menjadi masalah apabila data mengandungi kod HTML atau XML, yang bergantung pada aksara ini.

Masalah

Dalam coretan kod berikut, medan XmlRequest mengandungi HTML- seperti kandungan, tetapi selepas pengekodan json.Marshal, < dan > aksara terlepas:

package main

import (
    "encoding/json"
    "fmt"
)

type Track struct {
    XmlRequest string `json:"xmlRequest"`
}

func main() {
    track := new(Track)
    track.XmlRequest = "<car><mirror>XML</mirror></car>"
    trackJSON, _ := json.Marshal(track)
    fmt.Println("After Marshal:", string(trackJSON))
}
Salin selepas log masuk

Rentetan JSON yang terhasil ialah:

{"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
Salin selepas log masuk

Rentetan JSON yang dikehendaki, walau bagaimanapun, ialah:

{"xmlRequest":"<car><mirror>XML</mirror></car>"}
Salin selepas log masuk

Penyelesaian

Setakat Go 1.7, tiada mekanisme terbina dalam dalam json.Marshal untuk melumpuhkan melarikan diri. Walau bagaimanapun, penyelesaiannya ialah dengan mencipta fungsi tersuai yang secara eksplisit mengawal gelagat melarikan diri.

func (t *Track) JSON() ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(t); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
Salin selepas log masuk

Dalam kaedah JSON() tersuai ini, bendera SetEscapeHTML pengekod ditetapkan kepada palsu, melumpuhkan karakter HTML yang melarikan diri. Dengan memanggil kaedah ini dan bukannya json.Marshal, kandungan asal boleh dikekalkan tanpa melarikan diri:

trackJSON, err := track.JSON()
Salin selepas log masuk

Sebagai alternatif, penyelesaian yang lebih generik boleh dilaksanakan dengan mencipta fungsi yang mengambil mana-mana antara muka{} sebagai input:

func JSONMarshal(v interface{}) ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(v); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mencegah `` Melarikan diri Semasa JSON Marshaling 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