Отсутствует вложенный массив объекта структуры после демаршалинга json - PullRequest
0 голосов
/ 26 апреля 2018

Я столкнулся с некоторой проблемой с демаршированием строки обратно в struct object, когда у объекта есть вложенный массив объектов struct.Я использую следующий код для демонстрации своей проблемы:

Строка json:

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

У меня есть две структуры, следующие как Session , являющийся родителем, и SharedItem являющийся ассоциированным дочерним элементом (ren):

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

1 Ответ

0 голосов
/ 26 апреля 2018

Golang Spec для json unmarshal опишите всеточное совпадение, но также принимает нечувствительное к регистру совпадение.По умолчанию ключи объекта, которые не имеют соответствующего структурного поля, игнорируются (см. 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))
}

Пример игровой площадки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...