Задать вопрос
@rustler2000
погромист сикраш

Как маршалить одну и туже структуру в json с разным набором полей?

Есть сложная структура связных данных, для которой надо сделать разные view.
Совсем не хочеться копировать данные, особенно когда их много и они связанные.

Тоесть с одих и тех же данных мне надо генерировать два разных json.

Есть ли либа для json маршалинга, чтобы можно было явно передовать "описание" полей и не использовать тэги в полях типа?
  • Вопрос задан
  • 386 просмотров
Подписаться 6 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
@rustler2000 Автор вопроса
погромист сикраш
Вот так уже лучше, но в мапах приходится хранить анонимные типы (скорее всего в слайсах будет также)

https://play.golang.org/p/e1w5-RVRE0w

package main

import (
	"encoding/json"
	"fmt"
)

// Canonical types
type Aaa struct {
	Field1 string
	Field2 int
	Field3 map[int]*struct {
		Field4 int
		Field5 string
	}
}

func main() {
	// Data
	a := &Aaa{"string", -1, map[int]*struct {
		Field4 int
		Field5 string
	}{}}
	a.Field3[100] = &struct {
		Field4 int
		Field5 string
	}{100, "text"}
	a.Field3[200] = &struct {
		Field4 int
		Field5 string
	}{200, "text22222"}

	// Regular json marshal
	b1, _ := json.MarshalIndent(a, "", "  ")
	fmt.Printf("%s\n", string(b1))

	// Alternative types
	b2, _ := json.MarshalIndent(*(*struct {
		Field1 string `json:"Typ"`
		Field2 int    `json:"Prio,string"`
		Field3 map[int]*struct {
			Field4 int    `json:"-"`
			Field5 string `json:"Text"`
		} `json:"Map"`
	})(a), "", "  ")
	fmt.Printf("%s\n", string(b2))
}
Ответ написан
Комментировать
hugga
@hugga
Вот интересный пример, как на лету менять тэги структуры. Можно просто добавить для каждого view свой метод, меняющий всё представление
Еще обратите внимание на библиотеку, которая позволит вам менять поля в существующей структуре, или проще, создать собственную обертку над структурой
UPD: Нашел ту самую библиотеку, которая без копирования данных, в рантайме изменяет теги полей структуры github.com/sevlyar/retag
Ответ написан
Ваш ответ на вопрос

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

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