登录
首页 >  Golang >  Go问答

在将数据结构转换为 JSON 格式时会丢失信息

来源:stackoverflow

时间:2024-03-06 18:06:26 347浏览 收藏

大家好,今天本人给大家带来文章《在将数据结构转换为 JSON 格式时会丢失信息》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

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

这可能是我的应用程序中的一个设计缺陷,但由于我是一个 go 初学者,我不太了解。感谢帮助。

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

显然所有信息都被正确编组到 json 中。但解组忽略了流的实际值,只是将它们添加到映射中作为

如何正确解决这个问题?


解决方案


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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>