首頁 > 後端開發 > Golang > 主體

marshal 和 unmarshal 時動態更改 json key

WBOY
發布: 2024-02-11 09:30:09
轉載
1205 人瀏覽過

marshal 和 unmarshal 时动态更改 json key

php小編小新將為大家介紹一個在Marshal和Unmarshal過程中動態改變JSON鍵值的方法。在處理JSON資料時,有時候我們需要對鍵值進行修改或替換。本文將分享一個簡單而有效的技巧,幫助開發者在PHP中實現這一目標。透過使用一些特定的函數和技術,我們可以輕鬆地對JSON資料進行操作,實現動態更改鍵值的需求。接下來,請跟著小編一起學習這個實用的技巧吧!

問題內容

我被迫使用 API,該 API 對於同一物件(增值稅號)有兩個不同的金鑰或識別碼。取決於呼叫的是 GET 還是 POST/PATCH

在 GET 中,我必須使用此結構對 json 進行解組/解碼:

type SilverfinCompany struct {
    ID                     int    `json:"id"`
    Name                   string `json:"name"`
    Vat                    string `json:"vat"` // here
}
登入後複製

在 POST 和 PATCH 中,我可以使用此結構將資料編組為 json:

<code>type SilverfinCompany struct {
    ID                     int    `json:"id"`
    Name                   string `json:"name"`
    Vat                    string `json:"vat_identifier"` // here
}
</code>
登入後複製

顯而易見的解決方案是擁有兩個內容相同但 JSON 鍵略有不同的「不同」結構,以及兩個轉換函數。或在結構中有兩個不同的字段:Vat 和 VatIndentifier。

問題在於,它會為已經很複雜的程式碼增加額外的複雜度。

所以我想知道:

有沒有辦法(類似反射)根據情況改變結構中 Vat 欄位的 JSON 鍵?

解決方法

您無法在執行時修改類型定義,包括結構標記。

只要欄位類型和順序(即記憶體佈局)相同,就根本不需要任何轉換函數,它們可以直接轉換:https://go.dev/play/p/IhkVM-BMLiY

func main() {
    foo := SilverfinCompanyFoo{
        ID:   1,
        Name: "Baz",
        Vat:  "Qux",
    }

    bar := SilverfinCompanyBar(foo)
    fmt.Println(bar)
}

type SilverfinCompanyFoo struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Vat  string `json:"vat"` // here
}

type SilverfinCompanyBar struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Vat  string `json:"vat_identifier"` // here
}

// {1 Baz Qux}
登入後複製

這是此類場景的常見解決方案。

以上是marshal 和 unmarshal 時動態更改 json key的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板