如何解决使用goavro处理多种类型的解码数据 程序
我想做什么?
对于数据库中的每个更改,我都尝试将debezium事件转换为数据库值的CSV,以便加载到Redshift中。
对于110以下的更改,我正在尝试制作一个csv文件:@Headers("Content-type:application/json")
@POST("user.php")
suspend fun getUsers(@Body body: String): List<User>
val jsonObject = JSONObject()
jsonObject.put("user",user)
jsonObject.put("id","" + id)
val users = network.getUsers(jsonObject.toString())
这是我尝试使用goavro进行的操作。
程序
https://play.golang.org/p/A8Wd0sZPUEQ
110,vck,desc,221.1
有没有更好的方法?对于每种数据类型,我都需要在此处使用switch语句。...
关联的GoAVRO问题:https://github.com/linkedin/goavro/issues/217
解决方法
fmt.Sprintf
可用于将接口转换为字符串。
str := fmt.Sprintf("%v",v)
这样做可以将case语句减少为2:
package main
import (
"fmt"
"encoding/json"
)
func main() {
debeziumEvent := `{"before":null,"after":{"datapipe.inventory.products.Value":{"id":110,"name":"vck","description":{"string":"desc"},"weight":{"double":221.10000610351562}}},"source":{"query":null,"snapshot":{"string":"true"},"server_id":0,"gtid":null,"name":"datapipe","thread":null,"ts_ms":0,"file":"mysql-bin.000049","version":"1.2.1.Final","connector":"mysql","pos":154,"table":{"string":"products"},"row":0,"db":"inventory"},"op":"c","ts_ms":{"long":1597649700266},"transaction":null}`
var data map[string]interface{}
err := json.Unmarshal([]byte(debeziumEvent),&data)
if err != nil {
panic(err)
}
//fmt.Printf("data=%v\n",data)
after := data["after"].(map[string]interface{})
csv := []string{}
for _,v := range after {
for _,v2 := range v.(map[string]interface{}) {
switch v2.(type) {
case map[string]interface{}:
for _,v3 := range v2.(map[string]interface{}) {
csv = append(csv,fmt.Sprintf("%v",v3))
}
default:
csv = append(csv,v2))
}
}
}
fmt.Println(csv)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。