【问题标题】:Go json, marshal empty value去json,封送空值
【发布时间】:2017-07-28 01:36:07
【问题描述】:

我遇到了omitempty 和空值的问题。请参阅this playground example。在值"" 的情况下,我有一个值,我不想在编组期间被忽略。这明确意味着我想清除该值,因此我想要编组结果:

{"cf_objectType":"Product","cf_isLocked":"No","cf_ErrorMessage":""}

现在我尝试了指向字符串的方法here,但由于某种原因我不喜欢这种方法。是否有任何已知的替代方案?例如,为什么我们没有像omitnull 这样的标签(就像omitempty)?

编辑

为了澄清,见下文

m := Metadata{
    ObjectType:   "Product",
    Locked:       "No",
    ErrorMessage: "",

}

我希望这个结构上的 marshal 函数的结果是:

{
    "cf_objectType":"Product",
    "cf_isLocked":"No",
    "cf_ErrorMessage":""
}

m := Metadata{
    ObjectType:   "Product",
    Locked:       "No",
}

结果应该是:

{
    "cf_objectType":"Product",
    "cf_isLocked":"No",
}

【问题讨论】:

  • 你想得到哪个json作为结果?如果你删除 omitemptyErrorMessage 你会得到:{"cf_objectType":"Product","cf_isLocked":"No","cf_errorMessage":""} 这是你需要的吗?
  • 见我编辑,这说明了更多。
  • 问题是,ErrorMessage 被隐式初始化为零值""。因此,这两个示例将相同的数据输入Marshal,因此它们将总是产生相同的输出。如果你不喜欢使用*string(尽管你没有说明原因),那么即使有omitnil,它也无济于事——你不能有一个零字符串,只有一个零指针,因此您仍然需要使用指向字符串的指针。
  • 好的,这行得通:play.golang.org/p/TYk67p6i_b 但是我在结构定义中混合了string*string。如果没有var emptyString = "",我也无法“填充”值,对吧?

标签: json go isnullorempty


【解决方案1】:

如果你不想省略空值,只需删除omitempty标签

https://play.golang.org/p/6axA2OIG6O

【讨论】:

    【解决方案2】:

    关于你最后的评论(我没有足够的声誉来回复):

    好的,这行得通:play.golang.org/p/TYk67p6i_b 但后来我混合了 我的结构定义中的字符串和 *string。我也不能“填充” 没有var emptyString = ""的值,对吧?

    this (Golang: set nil string pointer to empty string) 帖子

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 2018-12-08
      相关资源
      最近更新 更多