Go json トラップ レコードを共有する

藏色散人
リリース: 2021-06-15 11:05:23
転載
2224 人が閲覧しました

以下は、golang チュートリアル コラムからの Go json トラップ レコードです。困っている友人に役立つことを願っています。

JSONは、読みやすいテキストに基づいており、属性値またはシリアル値で構成されるデータオブジェクトを送信するために使用されます。もちろん、Go も完全にサポートしており、encoding/json を通じて JSON データを簡単にシリアル化および逆シリアル化できます。ただし、特別な注意が必要な重要なポイントがいくつかあります。

Go では json.Marshal() を使用して JSON データを簡単に取得できます。この関数に対応する godoc ドキュメントを参照してください。その中には次のような一節があります:

String values encode as JSON strings coerced to valid UTF-8, replacing invalid bytes with the Unicode replacement rune. So that the JSON will be safe to embed inside HTML <script> tags, the string is encoded using HTMLEscape, which replaces "<", ">", "&", U+2028, and U+2029 are escaped to "\u003c","\u003e", "\u0026", "\u2028", and "\u2029". This replacement can be disabled when using an Encoder, by calling SetEscapeHTML(false).
ログイン後にコピー

json.Marshal() シリアル化時に HTMLEscape エンコードが実行され、「<」、「>」、「&」、U 2028、および U 2029 は「\u003c」にトランスコードされます。 「\u003e」、「\u0026」、「\u2028」、「\u2029」。通常の使用では問題ありませんが、第三者が JSON 文字列の概要を抽出して比較する必要がある場合、一方が HTMLEscape エンコードを実行しない場合、抽出された概要はまったく異なるものになります。上記のドキュメントには、SetEscapeHTML(false) によって無効にできる解決策も記載されています。メソッドは次のとおりです:

bf := bytes.NewBuffer([]byte{})jsonEncoder := json.NewEncoder(bf)jsonEncoder.SetEscapeHTML(false)_ = jsonEncoder.Encode(body)jsonStr := bf.String()
ログイン後にコピー

ただし、この方法で使用する場合はまだいくつかの問題があり、json.Encoder.Encode() によって 改行文字##が追加されます。 # JSON 文字列の後にこの関数 ソース コードは次のとおりです:

// Encode writes the JSON encoding of v to the stream,
// followed by a newline character.
//
// See the documentation for Marshal for details about the
// conversion of Go values to JSON.
func (enc *Encoder) Encode(v interface{}) error {
    if enc.err != nil {
        return enc.err
    }
    e := newEncodeState()
    err := e.marshal(v, encOpts{escapeHTML: enc.escapeHTML})
    if err != nil {
        return err
    }

    // Terminate each value with a newline.
    // This makes the output look a little nicer
    // when debugging, and some kind of space
    // is required if the encoded value was a number,
    // so that the reader knows there aren&#39;t more
    // digits coming.
    e.WriteByte(&#39;\n&#39;)

    b := e.Bytes()
    if enc.indentPrefix != "" || enc.indentValue != "" {
        if enc.indentBuf == nil {
            enc.indentBuf = new(bytes.Buffer)
        }
        enc.indentBuf.Reset()
        err = Indent(enc.indentBuf, b, enc.indentPrefix, enc.indentValue)
        if err != nil {
            return err
        }
        b = enc.indentBuf.Bytes()
    }
    if _, err = enc.w.Write(b); err != nil {
        enc.err = err
    }
    encodeStatePool.Put(e)
    return err
}
ログイン後にコピー

この関数はシリアル化後に別の

\n 文字を書き込むことがわかります。文字が必要ない場合は、追加の削除が必要です:

jsonStr := string(bf.Bytes()[:bf.bf.Len()])
ログイン後にコピー

以上がGo json トラップ レコードを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート