簡體   English   中英

如何使用未知字段類型將數據解組到 JSON

[英]How to Unmarshall data to JSON with unknown field types

我有這些“結構”

type Results struct {
    Gender string `json:"gender"`
    Name   struct {
        First string `json:"first"`
        Last  string `json:"last"`
    } `json:"name"`
    Location struct {
        Postcode int `json:"postcode"`
    }
    Registered struct {
        Date string `json:"date"`
    } `json:"registered"`
}

type Info struct {
    Seed    string `json:"seed"`
    Results int64  `json:"results"`
    Page    int64  `json:"page"`
    Version string `json:"version"`
}

type Response struct {
    Results []Results `json:"results"`
    Info    Info      `json:"info"`
}

我向外部 API 發出請求並將數據轉換為 JSON 視圖。 我事先知道所有字段的類型,但是“郵政編碼”字段出現問題。 我得到不同類型的值,這就是為什么我得到 JSON 解碼錯誤。 在這種情況下,“郵政編碼”可以是以下三種變體之一:

  1. 字符串〜“13353”
  2. 整數 ~ 13353
  3. 字符串〜“13353郵政編碼”

postcode類型從string更改為json.Number解決了問題。 但是這個解決方案不滿足第三個“選項”。

我知道我可以嘗試創建自定義類型並在其上實現接口。 在我看來,使用json.RawMessage的最佳解決方案。 這是我第一次遇到這個問題,所以我仍在尋找解決方案的實現並閱讀文檔。

在這種情況下,最好的解決方案是什么? 提前致謝。

聲明一個自定義字符串類型並讓它實現json.Unmarshaler接口。

例如,您可以這樣做:

type PostCodeString string

// UnmarshalJSON implements the json.Unmarshaler interface.
func (s *PostCodeString) UnmarshalJSON(data []byte) error {
    if data[0] != '"' { // not string, so probably int, make it a string by wrapping it in double quotes
        data = []byte(`"`+string(data)+`"`)
    }

    // unmarshal as plain string
    return json.Unmarshal(data, (*string)(s))
}

https://play.golang.org/p/pp-zNNWY38M

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM