【发布时间】: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作为结果?如果你删除
omitempty为ErrorMessage你会得到:{"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