VladimirAndreev
@VladimirAndreev
php web dev

Как правильно разворачивать json произвольной структуры?

Всем привет.
Есть задача.
Есть очередь, в которую сыпятся таски разных типов, на которые уникально указывает свойство alias в json-таске.
В задаче также содержится свойство data, в котором содержится guid задачи и поле properties, в котором лежит произвольный объект, необходимый для обработки задачи.

Вот такой код нормален для разбора json? Естественно, в будущем структуры данных, кроме глобальной Task, переедут по отдельным файлам вместе с логикой их обработки.

package main

import (
	"encoding/json"
	"fmt"
)

type Task struct {
	Alias string
}

type FootballTaskDataProperties struct {
	A int
	B int
	C int
	D int
}

type FootballTaskData struct {
	Guid       string
	Properties FootballTaskDataProperties
}

type FootballTask struct {
	Alias string
	Data  FootballTaskData
}

func main() {

	var item Task

	var jsonData = []byte(`{"alias":"football", "data": {"guid":"0aeaa197-44f5-4f73-a179-982cd2f0a52d", "properties": {"a":1,"b":97,"c":5,"d":0}, "Version":"4.7.1471"}}`)

	err := json.Unmarshal(jsonData, &item)

	if err != nil {
		fmt.Println("error:", err)
	}

	switch item.Alias {
	case "football":

		var currentStruct FootballTask

		json.Unmarshal(jsonData, &currentStruct)

		fmt.Printf("\n%+v", currentStruct)
		fmt.Print(currentStruct.Data.Properties.A)
	}
}


Спасибо, что дочитали этот код до конца :-)
  • Вопрос задан
  • 252 просмотра
Решения вопроса 1
yellow79
@yellow79
Senior Software Engineer
У вас меняется только Properties, возможно стоит написать одну структуру, в которой меняющийся параметр обозначить как interface{} или map[string]interface{}, а после, при обработке тасков приводить данное значение в подобающий вид
type Task struct {
	Alias string `json:"alias"`
	Data  struct {
		GUID       string `json:"guid"`
		Properties map[string]interface{} `json:"properties"`
		Version string `json:"Version"`
	} `json:"data"`
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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