gpt4 book ai didi

json - 将复杂的 JSON 解码为结构并访问数据( slice 的 slice )

转载 作者:数据小太阳 更新时间:2023-10-29 03:44:16 24 4
gpt4 key购买 nike

一段时间以来,我一直在为这个问题而烦恼。我有一个 JSON 文件,它必须采用以下格式,我需要在 Go 中迭代并使用 IF 语句:

[
[
{
"configName": "customer"
},
{
"config": [
{
"emailSubject": "New customer added"
},
{
"text": "Hi test 2"
},
{
"text": "added 2"
}
]
}
]
[
{
"configName": "customerAndUser"
},
{
"config": [
{
"emailSubject": "New customer added"
},
{
"text": "Hi, test 1"
},
{
"text": "added 1"
}
]
}
]
]

我想把它放到一个结构中,像这样:

type Config [][]struct {
configName string `json: configName`
config []struct {
Text string `json: text`
EmailSubject string `json: emailSubject`
} `json: config`
}

我可以像这样很好地解码数据:

configData, err := ioutil.ReadFile("testing-config.json")
if err != nil {
fmt.Println(err)
}
var configDataUnmarshalled Config

json.Unmarshal([]byte(configData), &configDataUnmarshalled)

然后数据打印出来,还好,但这里有点奇怪:打印语句为我没有指定要打印的项目返回空白。以下是我打印未编码数据时打印的示例:

打印未编码数据的输出:

[[{customer []} { [{ New customer added} {hi test 2 } {added 2 }]}] [{customerAndUser []} { [{ New customer added} {hi test 1 } {added 1 }]}]]

但是我似乎无法使用 IF 语句或循环遍历配置键中的元素!

IF 语句在 for 循环中被忽略(见代码下方的输出)

for _, configs := range configDataUnmarshalled {

for _, configurations := range configs {

fmt.Println("These are the top level elements in my struct: ", configurations.ConfigName)

if configurations.ConfigName == "customerAndUser" {

for _, config := range configurations.Config {

fmt.Println(config)
}
}
}
}

这是打印的内容:

These are the top level elements in my struct:  customer
These are the top level elements in my struct:
These are the top level elements in my struct: customerAndUser
These are the top level elements in my struct:

从 FOR 循环中,您可以看到我想在配置具有特定名称时访问数据,在本例中为“customerAndUser”

这里完全忽略了 IF 语句

我有两件事想了解/解决:

  1. 如何访问 IF 语句后的数据
  2. 为什么程序打印空白?

期望的输出是打印出 emailSubject 和两个 Text 元素的数据到名为 customerAndUser 的配置的控制台

应该打印什么:

New customer added
hi test 1
added 1

谢谢你的帮助

最佳答案

json 配置很臭。包含 configNameconfig 的结构是一个 slice 中的两个独立结构。 configName 具有值,因此 config 为空且向后。这将在像这样的 json 时起作用。

{
"configName": "customerAndUser",
"config": [
{
"emailSubject": "New customer added"
},
{
"text": "Hi, test 1"
},
{
"text": "added 1"
}
]
}

所以如果你不能改变 json 配置格式。这是解决方案

endUser := false

for _, configs := range configDataUnmarshalled {

endUser = false
for _, configurations := range configs {

if configurations.ConfigName == "customerAndUser" {
endUser = true
continue
}

if !endUser || len(configurations.Config) == 0 {
continue
}

for _, config := range configurations.Config {
fmt.Println(config)
}
}
}

关于json - 将复杂的 JSON 解码为结构并访问数据( slice 的 slice ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53540007/

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