json - 编码和解码结构到 json 丢失信息

标签 json go

我正在尝试将一个结构编码为 json(按预期工作)并直接再次解编它,但似乎信息丢失了。

这可能是我的应用程序中的一个设计缺陷,但作为一名围棋初学者,我并不了解更多。感谢帮助。

package main

import (
    "encoding/json"
    "fmt"
)

type Flow interface {
    Exec(input map[string]string) (output map[string]string, err error)
}

type FlowData struct {
    Static map[string]string
    Output map[string]string
}

type FooFlow struct {
    Data FlowData
}

func (flow FooFlow) Exec(input map[string]string) (output map[string]string, err error) {
    output = map[string]string{"message": flow.Data.Static["message"]}
    return output, nil
}

type BarFlow struct {
    Data FlowData
}

func (flow BarFlow) Exec(input map[string]string) (output map[string]string, err error) {
    output = map[string]string{"message": flow.Data.Static["prefix"] + "_bar"}
    return output, nil
}

type Pipeline struct {
    Entrypoint string
    Flows      map[string]Flow
}

func main() {
    foo := FooFlow{
        Data: FlowData{
            Static: map[string]string{"message": "foo"},
        },
    }

    bar := BarFlow{
        Data: FlowData{
            Static: map[string]string{"prefix:": "baz"},
        },
    }

    pipe := Pipeline{
        Entrypoint: "foobar",
        Flows: map[string]Flow{
            "foo": foo,
            "bar": bar,
        },
    }

    data, _ := json.Marshal(pipe)
    fmt.Printf("pipe1: %+v\n", pipe)
    fmt.Println("json:", string(data))

    var pipe2 Pipeline
    json.Unmarshal(data, &pipe2)
    fmt.Printf("pipe2: %+v\n", pipe2)
}

执行此操作会得到以下结果:

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>]}

显然所有信息都正确编码到 json 中。但是解码忽略了流的实际值,只是将它们作为 <nil> 添加到 map 中。 .

如何正确解决这个问题?

最佳答案

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

关于json - 编码和解码结构到 json 丢失信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51480830/

相关文章:

go build 找不到包源

Golang IO读取文件无效内存地址

go - 我应该为每个查询或其在 GraphQL 中的所有字段创建解析器吗?

python - DictCursor 与 RealDictCursor

go build -i 导致打开/usr/local/go/pkg/darwin_amd64/runtime/cgo.a : permission denied

Golang - 解析嵌套的 JSON

android - 如何从动态字段名更新 Realm 值

javascript - Jekyll 破坏 JSON 文件。箭头 ("=>")而不是 ":"

javascript - 如何在 fetch api 中处理空响应

javascript - 解析多数组 JSON? (JavaScript)