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上面的程式碼 。
相關文章
- Gin 框架 JSON 格式返回結果的使用方式框架JSON
- java通過url呼叫遠端介面返回json資料JavaJSON
- golang json字串轉結構體GolangJSON字串結構體
- golang中struct、json、map互相轉化GolangStructJSON
- laravel8統一介面返回的json格式—通過自定義函式及自定義exception返回成功及失敗結果LaravelJSON函式Exception
- php 透過 JSON RPC 與 golang 通訊PHPJSONRPCGolang
- 如何取出 API 呼叫返回的 JSON 資料APIJSON
- java生成json字串的方法JavaJSON字串
- 【Golang】Go 通過結構(struct) 實現介面(interface)GolangStruct
- 解析Json字串的三種方法JSON字串
- golang-json, 原始碼解釋struct轉json時,struct對屬性欄位需要大寫才能轉譯成功GolangJSON原始碼Struct
- Go 之基礎速學 (七) golang 裡包的使用 JSON 化 struct 結構體以及 if else 的初次使用(二)GolangJSONStruct結構體
- flask返回資料的幾種方式(字串,json,元祖)Flask字串JSON
- json字串返回的資料有重複的資料JSON字串
- json 物件與json 字串的區別。JSON物件字串
- Golang 的 JSON 包GolangJSON
- C#解析JSON字串總結C#JSON字串
- golang JSON技巧GolangJSON
- Json物件與Json字串互轉JSON物件字串
- 使用Json.NET驗證json字串是否格式正確JSON字串
- 字串與JSON字串JSON
- Newtonsoft序列化與反序列化json字串使用方法總結JSON字串
- PHP 如何通過 JSON-RPC 呼叫實現以太坊互動PHPJSONRPC
- 返回hash 型別的json型別JSON
- xml字串轉JSON字串XML字串JSON
- java使用mybatis 呼叫儲存過程返回一個遊標結果集JavaMyBatis儲存過程
- 使用json通過telegraf生成metrics(摘自telegraf github文件)JSONGithub
- Golang 流式解析 JsonGolangJSON
- 細說 Golang 的 JSON 解析GolangJSON
- java中json的使用方法JavaJSON
- MySQL 按指定 ID 順序返回結果MySql
- Mysql按指定 ID 順序返回結果MySql
- SpringCloud FeignClient呼叫返回結果為null。SpringGCCloudclientNull
- 格式化 curl 返回的 jsonJSON
- Golang中struct結構標籤(Tag)的使用GolangStruct
- 通過Go來分析和建立JSONGoJSON
- Flutter json解析json_serializable的使用及自動化生成模板FlutterJSON
- laravel 通過 rpc 呼叫 golang 程式LaravelRPCGolang
- JavaScript 字串與json物件互轉的幾種方法JavaScript字串JSON物件