@Lexa-slesar

Почему ничего не выводит?

package main
import (
	//"bytes"
	"io/ioutil"
	"net/http"
	"fmt"
	"encoding/json"
)

type sampleArray struct {
	String string
	Number int
	NameMap map[string]string
}

type Response struct {
	Version string
	Data map[string]sampleArray
}

func main() {
	var client http.Client
	resp, err := client.Get("https://api.myjson.com/bins/by9gw")
	if err != nil {
		return
	}
	defer resp.Body.Close()
	simpleResp := Response{}
	if resp.StatusCode == http.StatusOK {
		bodyBytes, _ := ioutil.ReadAll(resp.Body)
		bodyString := string(bodyBytes)
		byteString := []byte(bodyString)
		//fmt.Println(bodyString)
		_ = json.Unmarshal(byteString,&simpleResp)
		sampleArr := simpleResp.Data["sampleArray"]
		fmt.Println(sampleArr.NameMap["name"])
		
	}
}

Написал такой код, котороый делает Request на сайт https://api.myjson.com/bins/by9gw. Там находится простой json:
{"version":"1.0","data":{"sampleArray":["string value",5,{"name":"sub object"}]}}

Но программа ничего не выводит, хотя должна выводить map[]
  • Вопрос задан
  • 1596 просмотров
Решения вопроса 2
@ghostiam
На Go писатель, серверов пинатель.
Строка: json.Unmarshal(byteString,&simpleResp)
возвращает ошибку:
json: cannot unmarshal array into Go struct field Response.Data of type main.sampleArray
Ответ написан
У вас структуры совсем не соответствуют тому, что приходит в JSON.
sampleArray — это массив, а не структура.
Теги для version и data не прописаны, поэтому го их ищет в JSON с большой буквы.
Вообще, конкретный формат не очень будет удобно парсить в языке со статической типизацией, ибо элементы массива sampleArray имеют разный тип.

Можно сделать так
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

type Response struct {
	Version string                   `json:"version"`
	Data    map[string][]interface{} `json:"data"`
}

func main() {
	var client http.Client
	resp, err := client.Get("https://api.myjson.com/bins/by9gw")
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	simpleResp := Response{}
	fmt.Println("Response code:", resp.StatusCode)
	if resp.StatusCode == http.StatusOK {
		bodyBytes, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			panic(err)
		}
		_ = json.Unmarshal(bodyBytes, &simpleResp)
		sampleArr := simpleResp.Data["sampleArray"]
		fmt.Println(sampleArr[0])
		fmt.Println(sampleArr[1])

		casted, ok := sampleArr[2].(map[string]interface{})
		if !ok {
			panic("Wrong type of sampleArr element")
		}
		fmt.Println("Name:")
		fmt.Println(casted["name"])
	}
}

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы