将复杂的JSON转换为Golang中的地图

问题描述:

如何将复杂的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

你可以建立与一种类型的断言开关递归函数来键入断言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())