#go
#Вперед
Вопрос:
Приведенный ниже код отлично работает, отображая данные массива json. Вот рабочий ответ Json в приведенном ниже коде
{"provision":"provision section 1",
"subsets": [{"item":"milk"},{"payments": [{"price": "200 usd"}]}]}
Теперь у меня есть новый ответ json следующим образом. В новом ответе json ниже подмножества параметров теперь
заключен в квадратные скобки {}
{
"provision":{"subsets": [{"item":"milk"},{"payments": [{"price": "200 usd"}]}]}
}
Если я интегрирую новый json в код, он показывает ошибку не удается разархивировать объект в поле Go struct Head.Предоставление. Любые решения по решению проблемы с объектом будут оценены
Вот код
package main
import (
"bytes"
"encoding/json"
"fmt"
"log"
)
type Head struct {
Provision string `json:"provision"`
Subsets []Subset `json:"subsets"`
}
type Subset struct {
Payments []Payment `json:"payments"`
Item string `json:"item"`
}
type Payment struct {
Price string `json:"price"`
}
func main() {
/*
// old working json
m := []byte(`
{"provision":"provision section 1",
"subsets": [{"item":"milk"},{"payments": [{"price": "200 usd"}]}]}
`)
*/
// New json response not working
m := []byte(`
{
"provision":{"subsets": [{"item":"milk"},{"payments": [{"price": "200 usd"}]}]}
}
`)
r := bytes.NewReader(m)
decoder := json.NewDecoder(r)
val := amp;Head{}
err := decoder.Decode(val)
if err != nil {
log.Fatal(err)
}
fmt.Println(val.Provision)
// Subsets is a slice so you must loop over it
for _, s := range val.Subsets {
fmt.Println(s.Item)
// within Subsets, payment is also a slice
// then you can access each price
for _, a := range s.Payments {
fmt.Println(a.Price)
}
}
}
Комментарии:
1. Возможно, вы захотите добавить это в закладки: mholt.github.io/json-to-go
Ответ №1:
Ниже показано, как я заставил его работать. Спасибо
package main
import (
"bytes"
"encoding/json"
"fmt"
"log"
)
type Head struct {
Provision Prov `json:"provision"`
//Subsets []Subset `json:"subsets"`
}
type Prov struct {
Subsets []Subset `json:"subsets"`
}
type Subset struct {
Payments []Payment `json:"payments"`
Item string `json:"item"`
}
type Payment struct {
Price string `json:"price"`
}
func main() {
m := []byte(`
{"provision":
{"subsets": [{"item":"milk"},{"payments": [{"price": "200 usd"}]},
{"item":"SUGAR"},{"payments": [{"price": "600 usd"}]}
]}
}
`)
r := bytes.NewReader(m)
decoder := json.NewDecoder(r)
val := amp;Head{}
err := decoder.Decode(val)
if err != nil {
log.Fatal(err)
}
//fmt.Println(val.Provision)
// Subsets is a slice so you must loop over it
for _, s := range val.Provision.Subsets {
fmt.Println(s.Item)
// within Subsets, payment is also a slice
// then you can access each price
for _, a := range s.Payments {
fmt.Println(a.Price)
}
}
}
Комментарии:
1. Хотя этот код может работать, он не отвечает на вопрос, поскольку не дает объяснения, почему этот код работает, в то время как исходный код — нет. Код также должен быть отформатирован — в том виде, в каком он написан, он содержит массу ненужных пробелов, что делает его намного длиннее, чем необходимо, и, следовательно, его труднее читать.
Ответ №2:
type Head struct {
Provision Provision `json:"provision"`
}
type Provision struct {
Subsets []Subset `json:"subsets"`
}
https://play.golang.org/p/3TgxBOng1qE полная версия здесь.
Комментарии:
1. Спасибо, сэр Nvcnvn, за ваш вклад на данный момент. Я запустил решение, но выдает слишком много других массивов и объектов. Он должен просто показывать / печатать только значение milk и 200 долларов США в качестве ответа. Между спасибо
2. @NancyMooree что вы подразумеваете под слишком большим количеством других массивов? Или вы имеете в виду формат печати? play.golang.org/p/Ht6ERZz2s8L