Как в golang вывести json не объектами, а массивом?

Я получаю от сервера json ответ в виде объектов в объекте, а хочу получить в виде объектов в массиве.
Вот такой ответ я получаю

{"70":{"Id":70,"Exam_Id":5,"Student_Id":2,"Student_Fio":"Иванов"},"71":{"Id":71,"Exam_Id":5,"Student_Id":3,"Student_Fio":"Петров"}


А такой хочу получить

[{"Id":70,"Exam_Id":5,"Student_Id":2,"Student_Fio":"Иванов"},{"Id":71,"Exam_Id":5,"Student_Id":3,"Student_Fio":"Петров"}]


Вот код, который я написал, и который выводит данные не в том виде,котором хочу
type StudentsExam struct{
        Id int
        Exam_Id int 
        Student_Id int    
        Student_Fio string 
    }
    func getData(Exam_Id int) {
    	mapToEncode := make(map[string] StudentsExam)
    	 	for id, stud_exam := range StudentsExamList {
    	 		if stud_exam.Exam_Id == Exam_Id  {
    	            mapToEncode[strconv.Itoa(id)] = stud_exam
    	        }
    	    }
    	    data, err := json.Marshal(mapToEncode)
    	    if err != nil {
    	        log.Println("error: %v\n", err)
    	        return
    	    }
    }


data должна вывестись массивом, а не объектами. Подскажите, как это сделать?
  • Вопрос задан
  • 530 просмотров
Решения вопроса 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
Прэвэд))
Зачем используешь отображение там, где хочешь использовать слайс?))

StudentsExamList - тут ты врешь в названии, причем нагло, это отображение с ключами строками (id) не ясно, зачем так, это просто хранение данных, которые тебе нужны в другом виде.

type StudentExam struct{
	ID int
	ExamID int
	StudentID int
	StudentFIO string
}
func findStudentsByExamID(id uint) []*StudentExam {
	result := make([]*StudentsExam, len(StudentsExamList))

	var i uint
	for _, studentExam := range StudentsExamList {
		if studentExam.ID == id  {
			result[i] = studentExam
		}
		i++
	}

	return result
}

func DataToJSON(data interface{}) []byte {
	result, err := json.Marshal(data)
	if err == nil {
		return result
	}

	log.Printf("error: %v\n", err)
	return []byte{}
}


Some comments:

Разделяй логику. Вывод - это одно, а поиск данных - это совсем другое, метод делающий обе эти вещи - не самая хорошая мысль.

StudentsExamList на сколько я понял глобальная переменая, их можно использовать только в исключительных ситуациях. Глобальная публичная переменная - вот это вообще зло.

Не создавай методов "getData" конкретизируй например: getStudentsByExamID(id uint) []*Student

"get**" методы предполагают, что данные гарантировано есть, в противном случае стоит использовать префикс "find". В твоем случае, что будет, если examID = -157

Exam_Id, stud_exam переходи на светлую сторону, не нарушай кодстайл.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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