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 {
		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))
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM