json解组后缺少struct对象的嵌套数组

TonyGW:

当对象具有结构对象的嵌套数组时,我遇到了将字符串编组回结构对象的问题。我使用以下代码作为针对我的问题的演示:

json字符串是

const myStr = `{
  "name": "test_session1",
  "shared_items:": [
    {
      "id": 0,
      "name": ".aspnet"
    },
    {
      "id": 1,
      "name": ".bash_profile"
    }
  ]
}`

我有以下两个结构,其中Session是父级,而SharedItem是关联的子级。

type Session struct {
    ID              uint64           `json:"id"`
    Name            string           `json:"name,omitempty"`
    SharedItems     []SharedItem `json:"shared_items"`
}

type SharedItem struct {
    ID          uint64 `json:"id"`
    Name        string `json:"name"`
}

我尝试了以下操作以解组json字符串,但看起来好像缺少SharedItem对象的嵌套数组,因为我看到sess对象具有0个共享项,这不是我期望的。

func main() {
    var sess Session
    if err := json.Unmarshal([]byte(myStr), &sess); err != nil {
        panic(err)
    }
    fmt.Printf("sess name is: %s, and has %d shared items\n", sess.Name, len(sess.SharedItems)) // printed: sess name is test_session1, and has 0 shared items
}

这是我去游乐场的链接:https : //play.golang.org/p/a-y5T3tut6g

Himanshu:

JSON解组的Golang Spec全面描述了这一切

为了将JSON解组到结构中,Unmarshal将传入的对象密钥与Marshal使用的密钥(结构字段名称或其标记)进行匹配,希望使用精确匹配,但还要接受不区分大小写的匹配。默认情况下,没有相应结构字段的对象键将被忽略(有关替代方法,请参见Decoder.DisallowUnknownFields)。

在提供的json中,共享项的json对象中包含:冒号,因为我们看到它shared_items:不是shared_items我们的json标签

  "shared_items:": [
    {
      "id": 0,
      "name": ".aspnet"
    },
    {
      "id": 1,
      "name": ".bash_profile"
    }
  ]

删除:或追加到您的struct json标签以匹配相同的标签。

package main

import (
    "fmt"
    "encoding/json"
)

type Session struct {
    Name            string           `json:"name,omitempty"`
    SharedItems     []SharedItem    `json:"shared_items"`
}

type SharedItem struct {
    ID          uint64 `json:"id"`
    Name        string `json:"name"`
}

const myStr = `{"name":"test_session1","shared_items":[{"id":0,"name":".aspnet"},{"id":1,"name":".bash_profile"}]}`

func main() {
    var sess Session

    if err := json.Unmarshal([]byte(myStr), &sess); err != nil {
        panic(err)
    }
    fmt.Println(sess)
    fmt.Printf("sess name is: %s, and has %d shared items\n", sess.Name, len(sess.SharedItems))
}

游乐场的例子

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章