簡體   English   中英

如何將map [string] interface {}轉換為其他類型的結構?

[英]How can I turn map[string]interface{} to different type of struct?

我正在調用一個API,它將返回如下Json對象:

{
  name: "XXX"
  type: "TYPE_1"
  shared_fields: {...}
  type_1_fields: {...}
  ..
  type_2_fields: {...}
}

基於不同的類型,此對象將具有不同類型的字段,但是這些字段對於不同類型是確定的。 因此,我將Json字符串解組到map [string] interface {}以獲取不同的類型,但是如何將這些map [string] interface {}轉換為特定結構?

  var f map[string]interface{}
  err := json.Unmarshal(b, &f)
  type := f["type"]
  switch type {
    case "type_1":
      //initialize struct of type_1
    case "type_2":
      //initialize struct of type_2
  }

對於這種兩步json解碼,您可能需要檢出json.RawMessage 它允許您推遲處理json響應的各個部分。 文檔中的示例顯示了操作方法。

一種實現方法是擁有一個構造函數(一個以New…開頭的函數),該函數將地圖作為輸入參數。

在我看來,第二種方法要慢得多,那就是將重新編組為正確的struct類型。

如果類型足夠不同並且您想偷懶,則可以嘗試以每種格式對其進行解碼:

  f1 := type1{}
  err := json.Unmarshal(b, &f1)
  if err == nil {
      return f1
  }
  f2 := type2{}
  err := json.Unmarshal(b, &f2)
  if err == nil {
     return f2
  }
  ...

如果對象相似或不想變得懶惰,則可以解碼類型,然后執行以下操作:

  type BasicInfo struct {
     Type string `json:"type"`
  }

  f := BasicInfo{}
  err := json.Unmarshal(b, &f)
  switch f.Type {
    case "type_1":
      //initialize struct of type_1
    case "type_2":
      //initialize struct of type_2
  }

暫無
暫無

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

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