2015-07-05 38 views
3

什么是从网址中提取json的最佳方式,即从Rest中获取Rest服务? 此外,似乎大多数休息客户端库在强制使用json.marshall需要结构使用它。Golang:来自URL的Json作为地图

这并不在非结构化数据的情况下,你不完全知道什么会是未来的工作有没有办法把它简单地都进来作为地图[字符串:字符串。?

回答

1

为什么不把它解析成图[字符串]字符串作为这个代码要做

var d map[string]interface{} 
data, err := json.Unmarshal(apiResponse, &d) 

可以遍历数据在这个结构了。

如果你怀疑,该API响应可以是不奇异的对象,但对象的集合,该interface{}也适用于数组。

0

如果你不知道什么是在消息来了,你可以有几种情况。

依赖于类型的消息内容

类型通常由某个类型字段指示。在这种情况下,你可以使用包含所有类型的字段一个“联盟”的结构:上式

type Foo struct { 
    A int 
    B string 
} 

type Bar struct { 
    C int 
    D string 
} 

type Message struct { 
    Type string 
    Foo 
    Bar 
} 

// or this, if you have common fields 

type Message struct { 
    Type string 
    A int 
    B string 
    C int 
    D string 
} 

解组消息进入联盟结构,调度,并选择子结构。

var m Message 
json.Unmarshal(data, &m) 
switch m.Type { 
    case "foo": 
     ... 
    case "bar": 
     ... 
} 

完全动态的消息

在这种情况下,你有不相关的键值的集合,分别处理它们。

解析为map[string]interface{}。不利的一面是,你必须投入每个值并动态地检查它的类型。 警告:map[string]interface{}将所有数字转换成花车,偶数,所以你必须将它们转换成float64

如果您不想解析值,则也可以使用map[string]json.RawMessage,只有键(json.RawMessage[]byte,并在解组时保留原样)。

“信封” 与动态有效载荷

消息。例如:

{ 
    "type": "foo", 
    "payload": { 
     "key1": "value1" 
    } 
} 

{ 
    "type": "bar", 
    "payload": { 
     "key2": "value2", 
     "key3": [1, 2] 
    } 
} 

使用结构与json.RawMessage

type Message struct { 
    Type string 
    Payload json.RawMessage 
} 

type Foo struct { 
    Key1 string 
} 

type Bar struct { 
    Key2 string 
    Key3 []int 
} 

解析信封(有效载荷将被保留),然后在类型上分派,并将有效载荷分析到子结构中。

var m Message 
_ = json.Unmarshal(data, &m) 
switch m.Type { 
    case "foo": 
     var payload Foo 
     _ = json.Unmarshal(m.Payload, &payload) 
     // do stuff 
    case "bar": 
     var payload Bar 
     _ = json.Unmarshal(m.Payload, &payload) 
     // do stuff 
}