2017-08-02 59 views
0

如何將複雜的JSON對象轉換爲具有golang中所有正確類型的地圖。我完全必須做一些典型的Golang事情嗎?我在那裏創建一個結構體,其中包含我知道的字段,或者是否有一種通用的方法來獲取所有正確類型的字段?將複雜的JSON轉換爲Golang中的地圖

這裏是我想變成地圖的JSON的示例:

{ 
    "people": [ 
     { 
      "diffs": [ 
       77 
      ], 
      "original": { 
       "name": "Nick", 
       "active": "Active", 
       "email": "[email protected]" 
      }, 
      "id": "21" 
     } 
    ] 
} 
+0

歡迎使用靜態類型語言。使用'json'包,你總是可以解組成一個'map [string] interface {}',但這通常不是你真正想要的。 – RayfenWindspear

回答

1

你可以建立與一種類型的斷言開關遞歸函數來鍵入斷言JSON數組的多維地圖或平坦的地圖。不幸的是,你的多維地圖會很快變得複雜。如果你有一個嵌套的JSON數組,例如「map [string] map [string] map [string] string」),我經常需要映射至少幾個維度。人「。

如果您嘗試拼合嵌套的JSON數組,您的鍵將會重疊(即,您只能使用「名稱」鍵一次)。您可以標記鍵 - 例如「name_1」:「Nick」,但此解決方案可能無法用於您的用例。從鏈接兩個例子 http://github.com/Jeffail/gabs

我給你量身定製的例子,然後GABS的github上頁:

如果你想要去的多維路徑,這個包可以爲您的需求很好地工作:

package main 

import (
    "fmt" 
    "github.com/Jeffail/gabs" 
) 

func main() { 

    jsonS := `{ 
     "people": [ 
      { 
       "diffs": [ 
        77 
       ], 
       "original": { 
        "name": "Nick", 
        "active": "Active", 
        "email": "ni[email protected]" 
       }, 
       "id": "21" 
      } 
     ] 
    }` 

    gabsCon, err := gabs.ParseJSON([]byte(jsonS)) 

    if err != nil { 
     fmt.Println("gabs ParseJSON failed") 
    } 

    n1, ok := gabsCon.Path("people.original.name").Data().(string) 

    if !ok { 
     fmt.Println("gabs path failed") 
    } 

    fmt.Println(n1) 
} 

這裏的一個非定製的示例,其將打印 - 第一,第二,第三):

jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ "first", "second", "third" ]}`)) 

// S is shorthand for Search 
children, _ := jsonParsed.S("array").Children() 
for _, child := range children { 
    fmt.Println(child.Data().(string)) 
} 

而且,一個其他示例,將打印 - 1,2,3:

jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ {"value":1}, {"value":2}, {"value":3} ]}`)) 

fmt.Println(jsonParsed.Path("array.value").String())