Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将结构编组和反编组为json会丢失信息_Json_Go - Fatal编程技术网

将结构编组和反编组为json会丢失信息

将结构编组和反编组为json会丢失信息,json,go,Json,Go,我试图将一个结构封送到json(按预期工作)中,并再次直接将其解组,但似乎信息丢失了 这可能是我的应用程序中的一个设计缺陷,但由于我是一个新手,所以我不太清楚。谢谢你的帮助 主程序包 进口( “编码/json” “fmt” ) 类型流接口{ Exec(输入映射[字符串]字符串)(输出映射[字符串]字符串,错误) } 类型FlowData结构{ 静态映射[字符串]字符串 输出映射[字符串]字符串 } 类型foodflow结构{ 数据流数据 } func(flow FooFlow)Exec(输入映射

我试图将一个结构封送到json(按预期工作)中,并再次直接将其解组,但似乎信息丢失了

这可能是我的应用程序中的一个设计缺陷,但由于我是一个新手,所以我不太清楚。谢谢你的帮助

主程序包
进口(
“编码/json”
“fmt”
)
类型流接口{
Exec(输入映射[字符串]字符串)(输出映射[字符串]字符串,错误)
}
类型FlowData结构{
静态映射[字符串]字符串
输出映射[字符串]字符串
}
类型foodflow结构{
数据流数据
}
func(flow FooFlow)Exec(输入映射[string]字符串)(输出映射[string]字符串,错误){
output=map[string]string{“message”:flow.Data.Static[“message”]}
返回输出,零
}
类型BarFlow结构{
数据流数据
}
func(流BarFlow)Exec(输入映射[string]字符串)(输出映射[string]字符串,错误){
output=map[string]string{“message”:flow.Data.Static[“prefix”]+“\u bar”}
返回输出,零
}
类型管道结构{
入口点字符串
流映射[字符串]流
}
func main(){
foo:=FooFlow{
数据:FlowData{
静态:映射[string]字符串{“message”:“foo”},
},
}
坝:=坝流{
数据:FlowData{
静态:map[string]string{“prefix::“baz”},
},
}
管道:=管道{
入口点:“foobar”,
流:映射[字符串]流{
“福”:福,
“酒吧”:酒吧,
},
}
数据:=json.Marshal(管道)
fmt.Printf(“管道1:%+v\n”,管道)
Println(“json:,字符串(数据))
var管道2
Unmarshal(数据和管道2)
fmt.Printf(“管道2:%+v\n”,管道2)
}
执行此操作将得到以下结果:

pipe1: {Entrypoint:foobar Flows:map[foo:{Data:{Static:map[message:foo] Output:map[]}} bar:{Data:{Static:map[prefix::baz] Output:map[]}}]}

json: {"Entrypoint":"foobar","Flows":{"bar":{"Data":{"Static":{"prefix:":"baz"},"Output":null}},"foo":{"Data":{"Static":{"message":"foo"},"Output":null}}}}

pipe2: {Entrypoint:foobar Flows:map[bar:<nil> foo:<nil>]}
pipe1:{Entrypoint:foobar流:map[foo:{Data:{Static:map[message:foo]输出:map[]}}bar:{Data:{Static:map[prefix::baz]输出:map[]}}
json:{“Entrypoint”:“foobar”,“Flows”:{“bar”:{“Data”:{“Static”:{“prefix::“baz”},“Output”:null}},“foo”:{“Data”:{“Static”:{“message”:“foo”},“Output”:null}}}
管道2:{Entrypoint:foobar流:map[bar:foo:}
显然,所有信息都被正确地编组为json。但是解组忽略流的实际值,因为它只是将流作为
添加到映射中


如何正确地解决这个问题?

当结构字段是接口类型时,
编码/json
无法知道要使用什么具体类型来解组,因此它会跳过它。在定义中使用具体类型,或使用空的具体实例预填充接口字段,该实例可以解组。

解组时不要跳过错误。您的代码出现错误
json:无法将对象解组到Go-struct-field-Pipeline.Flow类型的main.Flow
。这就是你得到零作为输出的原因。谢谢你的建议。你能举例说明吗?