flutter json转对象_go-flutter开发桌面应用(四) go-flutter插件中参数的传递 struct转map...

标题超长了,应该是 struct转map[interface{}]interface{}。

最近比较慵懒,工作也忙成一坨,也没理清思路来写这比较重要的一个环节。

先简单说几个点,后面有时间再补充。认知有限,不一定对。


前面写了go-flutter插件如果传递参数,但是只是简单类型的参数。

结构体之类的,如何从go传递到flutter,这个也是有些麻烦。

go-flutter也是利用MethodChannel来传递消息,我只试了StandardMethodCodec{}这个。

go的struct需要转换成map才能被flutter正确接收(认知有限,不一定对)。

go中的struct转成map[string]interface{}比较简单,但是问题来了。

go-flutter的StandardMethodCodec{} 不支持map[string]interface{},支持map[interface{}]interface{}。

所以把go的map通过go-flutter传递给flutter时,还需要在go这边把map[string]interface{}转换成map[interface{}]interface{},flutter才能正确接收。

自己写了几个不一定好用的方法来实现go的从struct转换成map[interface{}]interface{}。

一 将struct转化为map

此函数将struct转为map[string]interface{}

// 将struct转化为map
// 》使用json
func StrctToMap(s interface{}) (map[string]interface{}, error) {
	m := make(map[string]interface{})
	j, err := json.Marshal(s)
	if err != nil {
		log.Print("Error occurs when convert struct to map. function: StrctToMap() -> json.Marshal()")
		return m, err
	}
	err = json.Unmarshal(j, &m)
	if err != nil {
		log.Print("Error occurs when convert struct to map. function: StrctToMap() -> json.Unmarshal()")
		return m, err
	}

	return m, nil
}

二 将string类型Key的Map转化为interface{}类型Key的Map

此函数将map[string]interface{}转为map[interface{}]interface{}

// 将string类型Key的Map转化为interface{}类型Key的Map
// 》interface{}类型Key的Map用于go-flutter插件
func ToIfKeyMap(m map[string]interface{}) (result map[interface{}]interface{}, err error) {

	result = make(map[interface{}]interface{})
	for k, v := range m {
		kindTmp := reflect.ValueOf(v).Kind()

		if kindTmp == reflect.Slice {
			vSlice, ok := v.([]interface{})

			if !ok {
				return result, errors.New("Error occurs when reflect slice.")
			}

			// 用于存放Map的切片
			var valSlice []interface{}
			for _, subVal := range vSlice {

				// 切片元素为Map类型
				if reflect.ValueOf(subVal).Kind() == reflect.Map {
					itemMap, itemOk := subVal.(map[string]interface{})
					if itemOk {
						ifKeyMap, err := ToIfKeyMap(itemMap)

						if err != nil {
							return nil, err
						}

						valSlice = append(valSlice, ifKeyMap)
					}
				} else { // 非Map类型(认为是普通类型)
					valSlice = append(valSlice, subVal)
				}
			}

			result[k] = valSlice
		} else if kindTmp == reflect.Map {

			tmpMap := make(map[interface{}]interface{})

			for k2, v2 := range v.(map[string]interface{}) {
				tmpMap[k2] = v2
			}

			result[k] = tmpMap
		} else {
			result[k] = v
		}
	}

	return result, nil
}

三 将struct转化为interface{}类型Key的Map

此函数利用上面两个函数,将struct转为map[interface{}]interface{}

// 将struct转化为interface{}类型Key的Map
// 》interface{}类型Key的Map用于go-flutter插件
func StructToIfKeyMap(s interface{}) (result map[interface{}]interface{}, err error) {
	// 先转换成string类型Key的Map
	m, err := StrctToMap(s)
	if err != nil {
		log.Print("Error occurs when convert struct to map with interface key. function: StrctToIfKeyMap() -> StrctToMap()")
		return result, err
	}

	// 再转换成interface类型Key的Map
	result, err = ToIfKeyMap(m)
	if err != nil {
		log.Print("Error occurs when convert struct to map with interface key. function: StrctToIfKeyMap() -> ToIfKeyMap()")
		return result, err
	}

	return result, nil
}

上面三个函数也放在了github上

相关代码(github):

https://github.com/bettersun/moist/blob/main/struct.go​github.com

上面的方法感觉转换效率比较低,等待大神指点一二。

最近脑子比较混乱,先写这么多,后面有时间整理好思路,再来补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值