3 回答
TA贡献1876条经验 获得超6个赞
一旦您将一个元素添加到您编组的数组/切片中,您就无能为力了。如果元素在数组/切片中,它将被编组(将包含在 JSON 输出中)。该json.Marshal()函数如何猜测您不想编组的元素?它不能。
您必须排除不会出现在输出中的元素。在您的情况下,您要排除空Problem结构。
最好/最简单的是创建一个辅助函数,[]Problem为您创建切片,排除空结构:
func createProbs(ps ...Problem) []Problem {
// Remove empty Problem structs:
empty := Problem{}
for i := len(ps) - 1; i >= 0; i-- {
if ps[i] == empty {
ps = append(ps[:i], ps[i+1:]...)
}
}
return ps
}
使用它创建一个切片是这样的:
probs := createProbs(prob0, prob1, prob2)
在Go Playground上尝试修改后的应用程序。
修改后的代码的输出(注意缺少空结构):
[{"s":"s0","t":"t0"},{"s":"s1","t":"t1"},{"s":"s2","t":"t2"}]
[{"s":"s0","t":"t0"},{"s":"s2","t":"t2"}]
TA贡献1827条经验 获得超7个赞
你不能轻易做到这一点。空结构也是一个结构,它将被序列化为{}. 甚至nil值将被序列化为null.
以下代码:包主
import (
"encoding/json"
"fmt"
)
func main() {
xs := []interface{}{struct{}{},nil}
b, _ := json.Marshal(xs)
fmt.Println(string(b))
}
将产生:
[{},null]
Playground
解决方案是为类型实现json.Marshaller接口Problems以跳过空结构。
- 3 回答
- 0 关注
- 254 浏览
添加回答
举报