gpt4 book ai didi

json - 为什么不能将此数据正确解码到我的对象模型中?

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

我这里有一个(非)工作示例:https://play.golang.org/p/qaYhKvJ65J3

我不确定为什么会出现以下数据:

alertData := `{
"Id": 0,
"Version": 0,
"OrgId": 1,
"DashboardId": 61,
"PanelId": 84,
"Name": "{qa-dev}{stats-pipeline} Topology Message Age (aggregator) alert",
"Message": "",
"Severity": "",
"State": "",
"Handler": 1,
"Silenced": false,
"ExecutionError": "",
"Frequency": 10,
"EvalData": null,
"NewStateDate": "0001-01-01T00:00:00Z",
"PrevStateDate": "0001-01-01T00:00:00Z",
"StateChanges": 0,
"Created": "0001-01-01T00:00:00Z",
"Updated": "0001-01-01T00:00:00Z",
"Settings": {
"conditions": [
{
"evaluator": {
"params": [
10000
],
"type": "gt"
},
"operator": {
"type": "and"
},
"query": {
"datasourceId": 2,
"model": {
"hide": true,
"refCount": 0,
"refId": "C",
"textEditor": false
},
"params": [
"C",
"5m",
"now"
]
},
"reducer": {
"params": [],
"type": "avg"
},
"type": "query"
}
],
"executionErrorState": "keep_state",
"frequency": "10s",
"handler": 1,
"name": "{qa-dev}{stats-pipeline} Topology Message Age (aggregator) alert",
"noDataState": "keep_state",
"notifications": []
}
}`

无法解码到以下对象模型中:

type Condition struct {
Evaluator struct {
Params []int `json:"params"`
Type string `json:"type"`
} `json:"evaluator"`
Operator struct {
Type string `json:"type"`
} `json:"operator"`
Query struct {
Params []string `json:"params"`
} `json:"query"`
Reducer struct {
Params []interface{} `json:"params"`
Type string `json:"type"`
} `json:"reducer"`
Type string `json:"type"`
}

当我执行以下操作时:

condition := Condition{}
err := json.Unmarshal([]byte(alertData), &condition)

if err != nil {
panic(err)
}

fmt.Printf("\n\n json object:::: %+v", condition)

我刚得到:json object:::::{Evaluator:{Params:[] Type:} Operator:{Type:} Query:{Params:[]} Reducer:{Params:[] Type: } 类型:

理想情况下,我能够将其解析为类似type Conditions []struct{ } 的内容,但我不确定您是否可以将模型定义为列表?

最佳答案

看起来您正在尝试访问嵌套在根“设置”属性下的“条件”属性。因此,您需要定义该根级类型和足够的字段来告诉解码器如何找到您的目标属性。因此,您只需要创建一个带有必要“设置/条件”字段的新“AlertData”类型。

例如 ( Go Playground ):

type AlertData struct {
Settings struct {
Conditions []Condition `json:"conditions"`
}
}

func main() {
alert := AlertData{}
err := json.Unmarshal([]byte(alertData), &alert)

if err != nil {
panic(err)
}

fmt.Printf("OK: conditions=%#v\n", alert.Settings.Conditions)
// OK: conditions=[]main.Condition{main.Condition{Evaluator:struct { Params []int "json:\"params\""; Type string "json:\"type\"" }{Params:[]int{10000}, Type:"gt"}, Operator:struct { Type string "json:\"type\"" }{Type:"and"}, Query:struct { Params []string "json:\"params\"" }{Params:[]string{"C", "5m", "now"}}, Reducer:struct { Params []interface {} "json:\"params\""; Type string "json:\"type\"" }{Params:[]interface {}{}, Type:"avg"}, Type:"query"}}
}

请注意,打印的列表包含如此多的类型信息,因为“条件”类型使用匿名结构作为字段类型。如果您要将它们提取到命名结构中,那么使用数据会更容易,例如:

type Condition struct {
Evaluator Evaluator `json:"evaluator"`
Operator Operator `json:"operator"`
// ...
}

type Evaluator struct {
Params []int `json:"params"`
Type string `json:"type"`
}

type Operator struct {
Type string `json:"type"`
}

//...
// OK: conditions=[]main.Condition{
// main.Condition{
// Evaluator:main.Evaluator{Params:[]int{10000}, Type:"gt"},
// Operator:main.Operator{Type:"and"},
// Query:main.Query{Params:[]string{"C", "5m", "now"}},
// Reducer:main.Reducer{Params:[]interface {}{}, Type:"avg"},
// Type:"query",
// },
// }

Go Playground example here...

关于json - 为什么不能将此数据正确解码到我的对象模型中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52616855/

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