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