Задать вопрос
@Pavel_Timofeev

При парсинге json объекта на golang возращается пустота?

Добрый день Всем.

Пробую распарсить следующий json

{
"id": "0",
"result":{
	"Maps":{
		"*Test":[
			{"Value": 6325}
		]
	},
	"Disabled": false
},
"error": null
}


Код вот такой
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	var jsonBlob = []byte(`
	{"id": "0",
"result":{
	"Maps":{
		"*Test":[
			{"Value": 6325}
		]
	},
	"Disabled": false
},
"error": null
}`)

type Mon struct {
	Value          interface{} `json:"Value"`
}

type BalanceMap struct {
	Mons []Mon `json:"*Test"`
}

type Result struct {
	BalanceMaps    BalanceMap  `json:"BalanceMap"`
	Disabled       interface{} `json:"Disabled"`
}

type Response struct {
	Id     interface{} `json:"id"`
	Result Result      `json:"result"`
	Error  interface{} `json:"error"`
}

	var species Response
	err := json.Unmarshal(jsonBlob, &species)
	if err != nil {
		fmt.Println("error:", err)
	}
	fmt.Printf("%+v", species.Result.BalanceMaps)
}


Почему при вызове
fmt.Printf("%+v", species.Result.BalanceMaps)


возвращается
{Mons:[]}

Мне нужно получить значение Value. Помогите пожалуйста
  • Вопрос задан
  • 403 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@InoMono
Это то что вы хотите

{
"id": "0",
"result":{
  "Maps":{
    "*Test":[
      {"Value": 6325}
    ]
  },
  "Disabled": false
},
"error": null
}


Это то, что возвращает обратная операция - json.Marshal
{
   "id":"0",
   "result":{
      "BalanceMap":{
         "*Test":null
      },
      "Disabled":false
   },
   "error":null
}

Не находите что они СЛИШКОМ РАЗЛИЧНЫ?
Ответ написан
Комментировать
Вы ошиблись с аннотацией
BalanceMaps BalanceMap `json:"Maps"`
У вас там почему-то "BalanceMap"
P.S. И странно, что у Disabled тип не bool, а interface{}
Ответ написан
Комментировать
@Pavel_Timofeev Автор вопроса
да я ступил со структурой. Сделал правильно, но теперь почему то если получать данные из функции

type AutoGenerated struct {
	ID     string `json:"id"`
	Result struct {
		Maps struct {
			Test []struct {
				Value int `json:"Value"`
			} `json:"*Test"`
		} `json:"Maps"`
		Disabled bool `json:"Disabled"`
	} `json:"result"`
	Error interface{} `json:"error"`
}

func getTest(param1 string) string {

	var jsonStr = []byte(fmt.Sprintf(`{"id":"0", "jsonrpc":"2.0", "method":"getTest", "params":[{"Param":"%s"}]}`, param1))

	req, err := http.NewRequest("POST", "Some Url", bytes.NewBuffer(jsonStr))

	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		log.Error(err)
		panic(err.Error())
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)

	var data AutoGenerated
	err = json.Unmarshal(body, &data)

	fmt.PrintLn(data.Result.Maps.Test[0].Value)
         fmt.PrintLn(data.Result.Maps.Test)

}


fmt.PrintLn(data.Result.Maps.Test) возвращает [{6325}]

А fmt.PrintLn(data.Result.Maps.Test[0].Value) возвращает
http: panic serving 127.0.0.1:49180: runtime error: index out of range

хотя такой код отрабатывает без ошибок

package main

import (
  "encoding/json"
  "fmt"
)

func main() {
  var jsonBlob = []byte(`
  {"id": "0",
"result":{
  "Maps":{
    "*Test":[
      {"Value": 6325}
    ]
  },
  "Disabled": false
},
"error": null
}`)

type AutoGenerated struct {
	ID     string `json:"id"`
	Result struct {
		Maps struct {
			Test []struct {
				Value int `json:"Value"`
			} `json:"*Test"`
		} `json:"Maps"`
		Disabled bool `json:"Disabled"`
	} `json:"result"`
	Error interface{} `json:"error"`
}

  var species AutoGenerated 
  err := json.Unmarshal(jsonBlob, &species)
  if err != nil {
    fmt.Println("error:", err)
  }
  fmt.PrinДт(species.Result.Maps.Test[0].Value)
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы