gpt4 book ai didi

json - 在 Go 中的嵌入式结构中组合任意 JSON 对象

转载 作者:IT王子 更新时间:2023-10-29 01:13:37 25 4
gpt4 key购买 nike

我正在尝试以 {{"s":"v1", "t":"v2"}, {"s":"v3", "t"的形式生成 JSON 对象: "v4"}, etc} 通过 Go 中的嵌入式结构。

type Problems []Problem 中的所有 Problem 项目都提前知道时,一切都很好,如 func ONE() 中所示 下面和 Playground demo 在这里。

但是,如果某些 K:V 对包含空值,我想避免获取 {{a},{},{c}} 而不是所需的 {{a },{c}},如下面和演示中的 func TWO() 所示。

或者,我如何在不知道是否会添加或省略概率项的情况下任意编写下面的 probs := Problems{prob0, prob1, prob2, etc}

package main

import (
"encoding/json"
"fmt"
)

type Problem struct {
S string `json:"s,omitempty"`
T string `json:"t,omitempty"`
}

type Problems []Problem

func main() {
ONE()
TWO()
}

func ONE() {
prob0 := Problem{S: "s0", T: "t0"}
prob1 := Problem{S: "s1", T: "t1"}
prob2 := Problem{S: "s2", T: "t2"}

probs := Problems{prob0, prob1, probe}

// fmt.Println(probs) // CORRECT: [{s0 t0} {s1 t1} {s2 t2}]

b, _ := json.Marshal(probs)
fmt.Println(string(b))

// CORRECT: [{"s":"s0","t":"t0"},{"s":"s1","t":"t1"},{"s":"s2","t":"t2"}]``
}

func TWO() {
prob0 := Problem{S: "s0", T: "t0"}
prob1 := Problem{S: "", T: ""} // empty values omited BUT NOT {}
prob2 := Problem{S: "s2", T: "t2"}

probs := Problems{prob0, prob1, probe}

// fmt.Println(probs)
// GOT: [{s0 t0} { } {s2 t2}]
// WANTED: [{s0 t0} {s2 t2}]

b, _ := json.Marshal(probs)
fmt.Println(string(b))

// GOT: [{"s":"s0","t":"t0"},{},{"s":"s2","t":"t2"}]
// WANTED: [{"s":"s0","t":"t0"},{"s":"s2","t":"t2"}]
}

最佳答案

一旦将元素添加到编码的数组/slice 中,您就无能为力了。如果一个元素在数组/slice 中,它将被编码(将包含在 JSON 输出中)。 json.Marshal()怎么会函数猜测您不想编码哪些元素?不能。

您必须排除不希望出现在输出中的元素。在您的情况下,您想排除空的 Problem 结构。

最好/最简单的方法是创建一个辅助函数,它为您创建 []Problem slice ,排除空结构:

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
}

使用这个创建 slice 是这样的:

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"}]

关于json - 在 Go 中的嵌入式结构中组合任意 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29389889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com