如何将JSON解组到由另一段代码提供的Go结构中?

邵逸夫:

我正在编写一个Go库,它将JSON解码为一个结构。JSON具有相当简单的通用模式,但是我希望该库的使用者能够将其他字段解码为嵌入通用结构的自己的结构,从而避免使用映射。理想情况下,我只想解码一次JSON。

目前看起来像这样。(为简便起见,删除了错误处理。)

JSON:

{ "CommonField": "foo",
  "Url": "http://example.com",
  "Name": "Wolf" }

库代码:

// The base JSON request.
type BaseRequest struct {
    CommonField string
}

type AllocateFn func() interface{}
type HandlerFn func(interface{})

type Service struct {
    allocator AllocateFn
    handler HandlerFn
}   

func (Service *s) someHandler(data []byte) {
    v := s.allocator()
    json.Unmarshal(data, &v)
    s.handler(v)
}

应用程式码:

// The extended JSON request
type MyRequest struct {
    BaseRequest
    Url string
    Name string
}

func allocator() interface{} {
    return &MyRequest{}
}

func handler(v interface{}) {
    fmt.Printf("%+v\n", v);
}

func main() {
    s := &Service{allocator, handler}
    // Run s, eventually s.someHandler() is called
}

我不喜欢这种设置的是allocator功能。所有实现都只是返回一个新的BaseRequest“子类型”。用一种更动态的语言,我将MyRequest改为传入in 的类型,并在库中实例化。Go中是否有类似的选项?

古斯塔沃·尼迈耶(Gustavo Niemeyer):

有几种方法可以解决此问题。一个既简单又方便的想法是定义一个提供给处理程序的更丰富的Request类型,而不是传递原始类型。这样,您可以以友好的方式实现默认行为,并支持边缘情况。这样还可以避免将默认类型嵌入自定义类型中,并允许您在不破坏客户端的情况下扩展功能。

寻求灵感:

type Request struct {
    CommonField string

    rawJSON []byte
}

func (r *Request) Unmarshal(value interface{}) error {
    return json.Unmarshal(r.rawJSON, value)
}

func handler(req *Request) {
    // Use common data.
    fmt.Println(req.CommonField)

    // If necessary, poke into the underlying message.
    var myValue MyType
    err := req.Unmarshal(&myValue)
    // ...
}

func main() {
    service := NewService(handler)
    // ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法将json数据解组到go中的结构(无法将数组解组到Go struct字段中)

Golang将嵌套的json解组到结构中

如何将json解组到结构的Go映射中?

如何将json压缩文件解组到结构中

如何使用Go将这个JSON数组解组到结构切片中?

在mongodb-go-driver中,如何将BSON编组/解组为结构

如何将json解组到[]人员?

如何将JSON解组到持续时间?

在Go中,如何将bson byte []数据解组为结构数组?

如果外部元素在GO中不相同,如何将嵌套json解组到结构

无法将JSON解组到结构中

如何使用golang将xml消息解组到结构中

如何将两个json值解组到同一变量中?

使用Go(golang),如何将数据解组到结构中,然后从该结构中调用特定字段?

在Go语言中,如何将json解组到对象数组?

如何将JSON正文解组到骆驼中的myclass列表

在Azure DevOps发布管道中,如何将最新版本升级到一段时间没有发布任何版本的阶段?

如何跟踪一段代码中变量的使用?

如何将多个代码段绑定到表单中的一个输入字段

如何将一段HTML代码转换为PDF文件?

如何将一段CSS代码转换为LESS CSS

如何将代码段从一个php文件包含到另一个文件中?

将一段文本复制到另一个文件中的特定点

如何将一段字符串从一个 df 列添加到 python/pandas 中的另一个?

如何将同一文件中的变量用于另一段代码

如何在 AWS Lambda 中将 Python 变量输入到一段 xml 代码中?

如何将一段 R 代码应用于数据框的每一列

如何将一段 R 代码转换为 Shiny 应用程序?

如何在一段代码中实现 .each() 函数?