gpt4 book ai didi

json - 在 Golang 中 Umarshalling 这个 JSON

转载 作者:IT王子 更新时间:2023-10-29 02:33:59 26 4
gpt4 key购买 nike

我正在自学如何在 Golang 中使用 JSON 包。很多事情看起来很简单,但我在解析从 3D 打印机检索到的一些 JSON 数据时遇到了麻烦。 JSON 看起来像这样:

{
"tasks": [
{
"class": "Task",
"id": "5fee231a",
"instances": {
"28253266": {
"class": "StateInstance",
"id": "28253266",
"progress": 1,
"stateType": "Y-EdgeAvoiding"
},
"1d774b49": {
"class": "StateInstance",
"id": "1d774b49",
"progress": 1,
"stateType": "X-Calibration"
},
},
"stateType": "StartingUp"
}
]
}

(注意:还有一些“实例”,但为简洁起见我没有包括它们,但它们都遵循这种模式,但具有不同的 stateType)

基本上,打印机有一个正在执行的任务(在上面的示例中,该任务的 ID 为 5fee231a)以及其中的子任务(例如任务 28253266)。

如果我使用这段代码:

    var vals interface{}
err = json.Unmarshal([]byte(myJSON), &vals)

if err != nil {
fmt.Println("Error:", err)
}

spew.Dump(&vals)

(使用 github.com/davecgh/go-spew 转储变量),然后我得到一些输出(注意:这不是全部输出,为简洁起见被剪掉了 :)) :

(*map[string]interface {})(0xc0820068e0)((len=1) {
(string) (len=5) "tasks": ([]interface {}) (len=1 cap=1) {
(map[string]interface {}) (len=4) {
(string) (len=5) "class": (string) (len=4) "Task",
(string) (len=2) "id": (string) (len=8) "5fee231a",
(string) (len=9) "instances": (map[string]interface {}) (len=13) {
(string) (len=8) "bd65d028": (map[string]interface {}) (len=4) {
(string) (len=5) "class": (string) (len=13) "StateInstance",
(string) (len=2) "id": (string) (len=8) "bd65d028",
(string) (len=8) "progress": (float64) 1,
(string) (len=9) "stateType": (string) (len=17) "CenteringPosition"
},
(string) (len=8) "d1e225e7": (map[string]interface {}) (len=4) {
(string) (len=2) "id": (string) (len=8) "d1e225e7",
(string) (len=8) "progress": (float64) 1,
(string) (len=9) "stateType": (string) (len=10) "TargetCold",
(string) (len=5) "class": (string) (len=13) "StateInstance"
},

这很好,但我希望能够获取给定实例的状态(例如,询问 X-Calibration 的进度,获取 1 作为返回)。所以我创建了一些结构:

type Message struct {
Tasks []struct {
Class string
Id string
Instances []struct {
Something []struct {
Class string
Id string
StateType string
}
}
}
}

Tasks 被解码,但没有一个实例:

====================== Error: json: cannot unmarshal object into Go value of type []struct { Something struct { Class string; Id string; StateType string } }
(*buccaneer.Message)(0xc082002c40)({
Tasks: ([]struct { Class string; Id string; Instances []struct { Something struct { Class string; Id string; StateType string } } }) (len=1 cap=4) {
(struct { Class string; Id string; Instances []struct { Something struct { Class string; Id string; StateType string } } }) {
Class: (string) (len=4) "Task",
Id: (string) (len=8) "5fee231a",
Instances: ([]struct { Something struct { Class string; Id string; StateType string } }) <nil>
}
}
})

并注意其中的 something 结构。我不知道如何命名该结构,因为实例具有唯一的名称(即每个“子任务”具有不同的 ID)

非常感谢任何帮助:)

编辑:更新以显示解码部分工作,实例除外

最佳答案

  • Instances 需要是一个映射,因为它是一个对象。

  • 您不需要在其中包含 Something,因为它已经是一个 map[string]struct{...}

  • (还有 Id should really be ID,但这是风格上的吹毛求疵。)

类型:

type Message struct {
Tasks []struct {
Class string
ID string
Instances map[string]struct {
Class string
ID string
StateType string
}
}
}

Playground :http://play.golang.org/p/r-wjaEiwP0 .

关于json - 在 Golang 中 Umarshalling 这个 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31589040/

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