2014-01-18 52 views
6

我正在開發將接收JSON的Web服務。去轉換類型太嚴格。將接口{}轉換爲某種類型

沒等我下面的函數interface{}轉換成bool

func toBool(i1 interface{}) bool { 
    if i1 == nil { 
     return false 
    } 
    switch i2 := i1.(type) { 
    default: 
     return false 
    case bool: 
     return i2 
    case string: 
     return i2 == "true" 
    case int: 
     return i2 != 0 
    case *bool: 
     if i2 == nil { 
      return false 
     } 
     return *i2 
    case *string: 
     if i2 == nil { 
      return false 
     } 
     return *i2 == "true" 
    case *int: 
     if i2 == nil { 
      return false 
     } 
     return *i2 != 0 
    } 
    return false 
} 

我認爲,功能還不夠完善,我需要的功能轉換interface{}stringintint64

所以我問題:Go中是否有庫(函數集)會將interface{}轉換爲某些類型

UPDATE

我的web服務接收JSON。我在map[string]interface{}中解碼,我無法控制編碼它的人。

因此,我收到的所有值都是interface{},我需要將其轉換爲某些類型。

所以它可能是nilintfloat64string[...]{...},我希望把它轉換爲它應該是什麼。例如intfloat64string[]stringmap[string]string與所有可能的情況,包括nil,錯誤的價值觀處理等

UPDATE2

我收到{"s": "wow", "x":123,"y":true}{"s": 123, "x":"123","y":"true"}{a:["a123", "a234"]}{}

var m1 map[string]interface{} 
json.Unmarshal(b, &m1) 
s := toString(m1["s"]) 
x := toInt(m1["x"]) 
y := toBool(m1["y"]) 
arr := toStringArray(m1["a"]) 
+0

我不認爲有一個。 – Agis

+0

你知道Go的'encoding/json'包會爲你做所有事情,對吧?但無論如何,反射庫可以查看界面並告訴你真正的底層值是什麼,如果這就是你的意思。 –

+1

爲什麼?你能告訴我更多關於你想要解決的現實世界問題嗎? - 你知道https://gobyexample.com/json嗎? – Matthias

回答

6

objx package正是你想要的,它可以直接使用易

物objx提供objx.Map類型,這是一個map[string]interface{} 暴露了強大Get方法(等等),讓您 並迅速得到訪問:JSON,並會給你默認值和其他很酷的功能到地圖內的數據,而不必 擔心類型的斷言,丟失的數據,默認值太多 等

這是使用的一個小例子:

o := objx.New(m1) 
s := o.Get("m1").Str() 
x := o.Get("x").Int() 
y := o.Get("y").Bool() 

arr := objx.New(m1["a"]) 

JSON的一個從DOC例如:

// use MustFromJSON to make an objx.Map from some JSON 
m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`) 

// get the details 
name := m.Get("name").Str() 
age := m.Get("age").Int() 

// get their nickname (or use their name if they 
// don't have one) 
nickname := m.Get("nickname").Str(name) 

很明顯,你可以使用類似這樣與平原運行時:

switch record[field].(type) { 
case int: 
    value = record[field].(int) 
case float64: 
    value = record[field].(float64) 
case string: 
    value = record[field].(string) 
} 

但如果你檢查objx accessors可以看到複雜的代碼類似於此,但有許多用法的情況下,所以我認爲最好的解決方案是使用objx庫。

相關問題