【问题标题】:How do I make sure that the fileds of the root struct get parsed first and then the fields of embedded struct gets parsed如何确保首先解析根结构的字段,然后解析嵌入式结构的字段
【发布时间】:2019-04-10 00:39:22
【问题描述】:

我的结构如下:-

type Inner struct {
    FooInner string `json:"fooInner"`
    BarInner string `json:"barInner,omitempty"`
}

type Root struct {
    Inner
    Foo string `json:"foo"`
    Bar string `json:"bar"`
}

我希望首先解析“根”结构的字段,然后解析“内部”结构的字段。但是这里先解析 Inner struct 的字段。

【问题讨论】:

  • JSON 文档规定了字段的顺序。所以我假设您询问的是 JSON 封送处理(不是解析),并且希望在 Inner 之前先封送 Root 字段?
  • 不解析结构。它们已经处于标准化形式。所以我不确定你在问什么。
  • “根”结构字段的反射应该首先发生,然后是其他字段。由于“Root”是“Inner”中的父结构和子结构。

标签: go struct


【解决方案1】:

如果您询问 JSON 封送处理(不是解析)并希望按特定顺序封送字段,封送处理程序通常会按其索引顺序封送字段并在此过程中递归任何嵌入的结构。结构字段索引 - 正如 json.Marhsal 使用的 reflect 包所见 - 由它们在代码中的出现顺序定义。

所以把你想要的字段放在第一位——然后是任何嵌入的结构:

type Root struct {
    Foo string `json:"foo"`
    Bar string `json:"bar"`
    Inner // <- move this last
}

游乐场Example

b, _ := json.Marshal(Root{})

{"foo":"","bar":"","fooInner":""}

【讨论】:

  • 有没有其他方法可以使嵌入的结构最终被解析而不是首先被解析。
  • 在递归到嵌入式结构之前,您必须先编写自己的编组器以首选本地字段。但是你为什么需要这个?按照您希望它们被封送的顺序列出代码中的字段是非常好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多