[英]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.