Как заставить json-ответ правильно работать в go

#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