2013-07-24 53 views
1

我正在構建一個http api,並且每個處理程序都會返回JSON數據,所以我構建了一個處理JSON編組和http響應的包裝函數(我包含了來自包裝器以及下面的一個示例處理程序)。go中的任意JSON數據結構

什麼是通過任意嵌套結構的最好方法(結構還包含任意類型/數量的字段)。現在我已經在帶有字符串鍵和接口{}的值的地圖上定位了。這是有效的,但是這是否是最慣用的方式呢?

result := make(map[string]interface{}) 
customerList(httpRequest, &result) 

j, err := json.Marshal(result) 
if err != nil { 
    log.Println(err) 
    errs := `{"error": "json.Marshal failed"}` 
    w.Write([]byte(errs)) 
    return 
} 
w.Write(j) 


func customerList(req *http.Request, result *map[string]interface{}) { 
    data, err := database.RecentFiftyCustomers() 
    if err != nil { 
     (*result)["error"] = stringifyErr(err, "customerList()") 
     return 
    } 

    (*result)["customers"] = data//data is a slice of arbitrarily nested structs 
} 
+1

我認爲地圖[字符串]接口{}是一個好主意。但是,地圖已經是引用了,你不需要使用指針。 – creack

+0

太棒了,認爲是小費。 –

+1

看看Andrew Gerrand的博客文章「JSON and Go」(http://blog.golang.org/json-and-go)。特別是「解碼任意數據」部分。 – Intermernet

回答

1

如果你不提前知道什麼類型,什麼結構和嵌套你,有沒有選擇,只能像map[string]interface{}解碼成通用的東西。所以在這裏沒有「慣用的」或「非慣用」。

(我個人會嘗試以某種方式固定結構,而不是有「任意」嵌套和組合。)