首頁 >後端開發 >Golang >如何在 Go 中安全地將 YAML 轉換為 JSON,而不遺失資料完整性?

如何在 Go 中安全地將 YAML 轉換為 JSON,而不遺失資料完整性?

Barbara Streisand
Barbara Streisand原創
2024-12-01 18:02:12207瀏覽

How to Safely Convert YAML to JSON in Go Without Losing Data Integrity?

在沒有結構體綁定的情況下將YAML 轉換為JSON

使用YAML 格式的動態資料時,通常需要將其轉換為JSON 以便進一步處理。然而,直接將 YAML 解組為空的 interface{} 可能會在遇到 map[interface{}]interface{} 類型時導致問題,如給定場景所示。

解:遞迴型別轉換

為了解決這個問題,使用了一個名為convert()的遞迴函數。此函數迭代interface{}值並執行以下轉換:

  • 將map[interface{}]interface{}值轉換為map[string]interface{}。
  • 將 []interface{} 值轉換為 []interface{}。

藉由這樣做,輸出的值可以安全地編組為 JSON 字串。

範例

以下是如何使用 Convert() 函數的範例:

import (
    "fmt"
    "log"

    "github.com/go-yaml/yaml"
    "encoding/json"
)

func convert(i interface{}) interface{} {
    switch x := i.(type) {
    case map[interface{}]interface{}:
        m2 := map[string]interface{}{}
        for k, v := range x {
            m2[k.(string)] = convert(v)
        }
        return m2
    case []interface{}:
        for i, v := range x {
            x[i] = convert(v)
        }
    }
    return i
}

func main() {
    // Define the YAML string
    const s = `Services:
    -   Orders: 
        -   ID: $save ID1
            SupplierOrderCode: $SupplierOrderCode
        -   ID: $save ID2
            SupplierOrderCode: 111111
    `

    // Unmarshal the YAML string into an empty interface
    var body interface{}
    if err := yaml.Unmarshal([]byte(s), &body); err != nil {
        log.Fatal(err)
    }

    // Recursively convert the interface to a map[string]interface{}
    body = convert(body)

    // Marshal the converted interface into a JSON string
    if b, err := json.Marshal(body); err != nil {
        log.Fatal(err)
    } else {
        fmt.Println("Converted JSON:", string(b))
    }
}

輸出

程式的輸出是轉換後的JSON:

Converted JSON: {"Services":[{"Orders":[
    {"ID":"$save ID1","SupplierOrderCode":"$SupplierOrderCode"},
    {"ID":"$save ID2","SupplierOrderCode":111111}]}]}

註解

  • 透過轉換為Go映射,元素的順序會遺失,因此可能不適合順序很重要的場景。
  • convert() 函數的最佳化和改進版本已作為庫發佈在 github.com/icza/dyno 上。它為處理動態 YAML 資料提供了便利性和靈活性。

以上是如何在 Go 中安全地將 YAML 轉換為 JSON,而不遺失資料完整性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn