golang通過反射使用json字串呼叫struct的指定方法及返回json結果
起因
在很多場合會存在這樣一個需求或者想法:提交一個類似這樣的json
{
"func_name":"FooBarAdd",
"params":[
123.4,
432.1
]
}
然後得到一個這樣的json
{
"func_name":"FooBarAdd",
"data":[
555.5
]
}
要達到這樣的目的,必須要先解析提交的json, 獲取到方法名和引數,然後找到擁有這個方法的實體,將引數做適當的型別轉換後呼叫方法,最後將得到的結果包裝成json返回。
至於這個json是通過http提交與返回,還是通過websocket提交與返回,抑或是通過tcp直接提交與返回,都是可以的。下面來看一下如何達到這個目的。
通過反射獲取struct指定的方法
假設現在有一個struct是這樣的
type FooBar struct {
}
func (f *FooBar) FooBarAdd(argOne, argTwo float64) float64 {
return argOne + argTwo
}
對於BarFuncAdd方法,可以這樣呼叫:
foobar := &FooBar{}
resultCallByName :=reflect.ValueOf(foobar).MethodByName("FooBarAdd").
Call([]reflect.Value{reflect.ValueOf(123.4),reflect.ValueOf(432.1)})
fmt.Println(resultCallByName[0].Float())
也可以這樣呼叫:
foobar := &FooBar{}
resultCallByIndex :=reflect.ValueOf(foobar).Method(0).
Call([]reflect.Value{reflect.ValueOf(123.4),reflect.ValueOf(432.1)})
fmt.Println(resultCallByIndex[0].Float())
結果都是555.5
通過json字串呼叫
如果想用一串這樣的json
{
"func_name":"FooBarAdd",
"params":[
123.4,
432.1
]
}
得到一個這樣的結果
{
"func_name":"FooBarAdd",
"data":[
555.5
]
}
則可以這樣呼叫
foobar := &FooBar{}
jsonData := `
{
"func_name":"FooBarAdd",
"params":[
123.4,
432.1
]
}
`
type RequestInfo struct {
FuncName string `json:"func_name"`
Params []interface{} `json:"params"`
}
type ResultInfo struct {
FuncName string `json:"func_name"`
Data []interface{} `json:"data"`
}
requestInfo := &RequestInfo{}
json.Unmarshal([]byte(jsonData), &requestInfo)
resultCallByJson :=reflect.ValueOf(foobar).MethodByName(requestInfo.FuncName).
Call([]reflect.Value{reflect.ValueOf(requestInfo.Params[0]),
reflect.ValueOf(requestInfo.Params[1])})
result := &ResultInfo{FuncName:requestInfo.FuncName,
Data: []interface{{resultCallByJson[0].Interface()}}
jsonResult, _ := json.Marshal(&result)
fmt.Printf("%s\n", jsonResult)
適當的完善
是不是覺得還少了點什麼,比如要是引數個數不匹配怎麼辦?型別轉化怎麼處理?如何做到更通用比如像這樣呼叫:
jsonDataBarFuncSwap := `
{
"func_name":"BarSwap",
"params":[
0.1,
0.9
]
}
`
result:=string(reflectinvoke.InvokeByJson([]byte(jsonStr))
完整的程式碼範例,請看github上面的程式碼 。
相關文章
- Java http協議呼叫介面返回json字串JavaHTTP協議JSON字串
- java通過url呼叫遠端介面返回json資料JavaJSON
- laravel8統一介面返回的json格式—通過自定義函式及自定義exception返回成功及失敗結果LaravelJSON函式Exception
- golang中struct、json、map互相轉化GolangStructJSON
- Ajax使用一+javascript解析Ajax返回的json字串JavaScriptJSON字串
- struts json型別返回結果異常問題JSON型別
- fastjson 返回json字串,JSON.parse 報錯ASTJSON字串
- Linux 通過命令列解析JSON字串Linux命令列JSON字串
- php 透過 JSON RPC 與 golang 通訊PHPJSONRPCGolang
- 【Golang】Go 通過結構(struct) 實現介面(interface)GolangStruct
- 如何取出 API 呼叫返回的 JSON 資料APIJSON
- java生成json字串的方法JavaJSON字串
- PHP通過反射實現物件的成員方法呼叫PHP反射物件
- 解析Json字串的三種方法JSON字串
- golang-json, 原始碼解釋struct轉json時,struct對屬性欄位需要大寫才能轉譯成功GolangJSON原始碼Struct
- Go 之基礎速學 (七) golang 裡包的使用 JSON 化 struct 結構體以及 if else 的初次使用(二)GolangJSONStruct結構體
- Golang 中使用 JSON 的小技巧GolangJSON
- js 將json字串轉換為json物件的方法解析JSON字串物件
- java使用mybatis 呼叫儲存過程返回一個遊標結果集JavaMyBatis儲存過程
- jQuery通過ajax返回json格式資料簡單介紹jQueryJSON
- 反射-通過反射獲取無參無返回值成員方法、帶參帶返回值成員方法並使用反射
- flask返回資料的幾種方式(字串,json,元祖)Flask字串JSON
- golang通過反射設定結構體欄位的值Golang反射結構體
- MySQL 按指定 ID 順序返回結果MySql
- Mysql按指定 ID 順序返回結果MySql
- Golang 的 JSON 包GolangJSON
- json字串返回的資料有重複的資料JSON字串
- java對過反射呼叫方法Java反射
- 架構師之json-----------通過path查詢指定資料架構JSON
- Golang json 解析GolangJSON
- golang json 示例GolangJSON
- 使用反射-動態建立物件及呼叫物件方法反射物件
- json 物件與json 字串的區別。JSON物件字串
- 反射-通過反射獲取私有構造方法並使用反射構造方法
- C#解析JSON字串總結C#JSON字串
- json字串和json格式物件的轉換JSON字串物件
- Json物件與Json字串互轉JSON物件字串
- 字串與JSON字串JSON