首頁  >  文章  >  後端開發  >  如何使用字串表示的自訂標記處理解群組 JSON?

如何使用字串表示的自訂標記處理解群組 JSON?

Linda Hamilton
Linda Hamilton原創
2024-10-31 08:37:29412瀏覽

How to Unmarshal JSON with Custom Tag Handling for String Representation?

使用自訂標記處理解群組JSON

嘗試將JSON 解組到結構中時,可能需要以不同方式處理具有自定義標記的字段。本文探討了一個問題,即結構體中的字段有一個標記,指示應將其解組為字串。

問題:

考慮一個JSON 字串和一個對應的結構:

<code class="json">{
  "I": 3,
  "S": {
    "phone": {
      "sales": "2223334444"
    }
  }
}</code>
<code class="go">type A struct {
  I int64
  S string `sql:"type:json"`
}</code>

目標是將「S」字段解組為字串,而不是結構。

解決方案:

使用Marshaler/Unmarshaler 介面:

Go 提供了一種透過實現自訂類型的Marshaler 和Unmarshaler 介面來覆寫預設JSON 編組和解組行為的方法。在本例中,建立一個名為RawString 的新類型並實作以下函數:

<code class="go">type RawString string

func (m *RawString) MarshalJSON() ([]byte, error) {
  return []byte(*m), nil
}

func (m *RawString) UnmarshalJSON(data []byte) error {
  if m == nil {
    return errors.New("RawString: UnmarshalJSON on nil pointer")
  }
  *m += RawString(data)
  return nil
}</code>

應用於結構體:

修改A 結構體以使用RawString 類型對於「S」欄位:

<code class="go">type A struct {
  I int64
  S RawString `sql:"type:json"`
}</code>

透過此實現,當JSON 解組為A 結構時,「S」欄位將被解組為字串,保留其原始JSON 表示形式。

用法範例:

<code class="go">const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

func main() {
  a := A{}
  err := json.Unmarshal([]byte(data), &a)
  if err != nil {
    log.Fatal("Unmarshal failed:", err)
  }
  fmt.Println("Done", a)
}</code>

輸出:

<code class="text">Done {3 {"phone": {"sales": "2223334444"}}}</code>

以上是如何使用字串表示的自訂標記處理解群組 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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