首先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 {
fmt.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))
}
