Golong使⽤反射提取数组中的数组对象、reflect.Value类型到string类型的转换⾸先json数据为下:
{
"code": 200,
"data": {
"pcode": "1000",
"annList": ["java.util.ArrayList", [{
"Name": "no1",
"sex": "1"
}, {
"Name": "n02",
"@sex": "2"
}]]
}
}
⽬的:在JSON提取出来“data”中“annList”数组的第⼆个参数,该参数是个数组对象
第⼀步:主函数如下:
func main() {
str :=`{"code":200,"data":{"pcode":"1000","annList":["java.util.ArrayList",[{"Name":"no1","sex":"1"},{"Name":"n02","@sex":"2"}]]}}`
result, _ :=GetArrayByFanshe([]byte(str))
fmt.Println(string(result))
}
第⼆步:GetArrayByFanshe函数接收main函数参数,提取数据
代码块⼀:
data := string(body)
fmt.Println("接收到的参数信息data为:",data)
fmt.Printf("变量data的数据类型是:%T\n",data)
olderResult := make(map[string]interface{})
err := json.Unmarshal([]byte(data), &olderResult)
if err != nil {
fmt.Printf("Json转换失败")
return nil, err
}
fmt.Println("经过json.Unmarshal函数处理后,数据olderResult为:",olderResult)
fmt.Printf("变量olderResult的数据类型是:%T\n",olderResult)
//NewResult作为参数
newResult := make(map[string]interface{})
newResult["code"] = olderResult["code"]
//获取date中的数组对象
resData := olderResult["data"]
fmt.Println("olderResult类型为map,提取key为data的value值赋值给resData,数据resData为:",resData)
结果如下:
代码块⼆:
/
/提取data中的annList
//resAnnexList := resData["annList"]
resAnnexList := resData.(map[string]interface{})["annList"]
//提取resAnnexList第⼆个值
var resList interface{}
fmt.Println("resAnnexList为:",resAnnexList)
fmt.Printf("resAnnexList的数据类型是:%T\n",resAnnexList)
结果如下:
代码块第⼆⾏错误写法:
resAnnexList := resData["annList"]
此写法提取map参数会发现以下错误:
此处报错:resData类型为 interface{},需要我们把resData断⾔强转为map类型
改为代码块第三⾏正确写法:
resAnnexList := resData.(map[string]interface{})["annList"]
代码块三(转成数组切⽚提取数据):
res := resAnnexList.([]interface{})[1:]
newResult["data"] = res
fmt.Println("resAnnexList转成数组,切⽚提取数据赋值给res",res)
fmt.Println("newResult的值为",newResult)
代码块四(反射提取数据):
fmt.Println("reflect.TypeOf(resAnnexList)=",reflect.TypeOf(resAnnexList)) //TypeOf返回接⼝中保存的值的类型,
fmt.Println("reflect.TypeOf(resAnnexList).Kind()=",reflect.TypeOf(resAnnexList).Kind()) //Kind返回该接⼝的具体分类
switch reflect.TypeOf(resAnnexList).Kind() { //此处等于 switch slice
case reflect.Slice:
s := reflect.ValueOf(resAnnexList) //返回s持有值的第i个元素
resList = s.Index(1)
//list := s.Index(1)
//rlist := list.Interface()
//re := rlist.([]interface{})
//resList = re
}
newResult["data"] = resList
fmt.Println("resList的值为",resList)
fmt.Printf("resList类型%T为\n",resList)
fmt.Println("newResult的值为",newResult)
由此可见:反射获取到的值是reflect.Value类型的,不能直接使⽤
解决⽅法:通过反射变量的Interface()⽅法转成Interface{}类型,再把Interface{}类型通过断⾔转成想要的类型
switch reflect.TypeOf(resAnnexList).Kind() { //此处等于 switch slice
case reflect.Slice:
s := reflect.ValueOf(resAnnexList) //返回s持有值的第i个元素
//resList = s.Index(1)
list := s.Index(1)
rlist := list.Interface()
re := rlist.([]interface{})
resList = re
}
newResult["data"] = resList
fmt.Println("resList的值为",resList)
fmt.Printf("resList类型%T为\n",resList)
fmt.Println("newResult的值为",newResult)
代码块五:所有代码
package main
import (
"encoding/json"
"fmt"
"reflect"
)
func GetArrayByFanshe(body []byte) ([]byte, error) {
data := string(body)
fmt.Println("接收到的参数信息data为:",data)
fmt.Printf("变量data的数据类型是:%T\n",data)
olderResult := make(map[string]interface{})
err := json.Unmarshal([]byte(data), &olderResult)
if err != nil {
fmt.Printf("Json转换失败")
return nil, err
}
fmt.Println("经过json.Unmarshal函数处理后,数据olderResult为:",olderResult)
fmt.Printf("变量olderResult的数据类型是:%T\n",olderResult)
//NewResult作为参数
newResult := make(map[string]interface{})
newResult["code"] = olderResult["code"]
//获取date中的数组对象
resData := olderResult["data"]
fmt.Println("olderResult类型为map,提取key为data的value值赋值给resData,数据resData为:",resData)
//提取data中的annList
//resAnnexList := resData["annList"]
resAnnexList := resData.(map[string]interface{})["annList"]
//提取resAnnexList第⼆个值
var resList interface{}
fmt.Println("resAnnexList为:",resAnnexList)
fmt.Printf("resAnnexList的数据类型是:%T\n",resAnnexList)
res := resAnnexList.([]interface{})[1:]
fmt.Println("resAnnexList转成数组,切⽚提取数据赋值给res",res)
fmt.Println("reflect.TypeOf(resAnnexList)=",reflect.TypeOf(resAnnexList)) //TypeOf返回接⼝中保存的值的类型,TypeOf(nil)会返回nil。 fmt.Println("reflect.TypeOf(resAnnexList).Kind()=",reflect.TypeOf(resAnnexList).Kind()) //Kind返回该接⼝的具体分类,此处返回slice switch reflect.TypeOf(resAnnexList).Kind() { //此处等于 switch slice
case reflect.Slice:
s := reflect.ValueOf(resAnnexList) //返回s持有值的第i个元素
//resList = s.Index(1)
list := s.Index(1)
rlist := list.Interface()
re := rlist.([]interface{})
resList = re
}
newResult["data"] = resList
fmt.Println("resList的值为",resList)
fmt.Printf("resList类型%T为\n",resList)
fmt.Println("newResult的值为",newResult)
//转换成json格式
resultData, err := json.Marshal(newResult)
if err != nil {
typeof arrayfmt.Printf("Json转换失败")
return nil, err
}
return resultData, nil
}
func main() {
str :=`{"code":200,"data":{"pcode":"1000","annList":["java.util.ArrayList",[{"Name":"no1","sex":"1"},{"Name":"n02","@sex":"2"}]]}}`
result, _ :=GetArrayByFanshe([]byte(str))
fmt.Println(string(result))
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论