Как выборочно упорядочить JSON для структуры? - PullRequest
3 голосов
/ 11 июля 2019

У меня есть структура:

type Paper struct {
    PID    int    `json:"pID"`
    PTitle string `json:"pTitle"`
    PDesc  string `json:"pDesc"`
    PPwd   string `json:"pPwd"`
}

В основном, я буду кодировать всю структуру в JSON. Однако иногда мне нужно краткая версия структуры; т.е. закодировать некоторые свойства, как мне реализовать эту функцию?

type BriefPaper struct {
    PID    int    `json:"-"`      // not needed
    PTitle string `json:"pTitle"`
    PDesc  string `json:"pDesc"`
    PPwd   string `json:"-"`      // not needed
}

Я думаю о создании структуры подмножества, что-то вроде BriefPaper = SUBSET(Paper), но не знаю, как реализовать ее в Golang.

Я надеюсь, что смогу сделать что-то вроде этого:

p := Paper{ /* ... */ }
pBrief := BriefPaper{}

pBrief = p;
p.MarshalJSON(); // if need full JSON, then marshal Paper
pBrief.MarshalJSON(); // else, only encode some of the required properties

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

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

type Paper struct {
    PID    int    `json:"pID"`
    PTitle string `json:"pTitle"`
    PDesc  string `json:"pDesc"`
    PPwd   string `json:"pPwd"`
}

type BriefPaper struct {
    Paper
    PID    int    `json:"pID,omitempty"`  // Just make sure you 
    PPwd   string `json:"pPwd,omitempty"` // don't set these fields!
}

p := Paper{ /* ... */ }
pBrief := BriefPaper{Paper: p}

Теперь при маршинге BriefPaper поля PID и PPwd будут опущены.

1 голос
/ 11 июля 2019

Почему вы просто делаете это, как показано ниже

type SubPaper struct {
    PID    int    `json:"pID"`
    PPwd   string `json:"pPwd"`
}

type Paper struct {
    SubPaper
    PTitle string `json:"pTitle"`
    PDesc  string `json:"pDesc"`
}

А затем выполните маршализацию Бумаги, если вы хотите получить полный ответ

и выборочные элементы SubPaper

0 голосов
/ 11 июля 2019

Использование omitempty в теге. Не нужно указывать элементы для включения при создании экземпляра структуры.

type Paper struct {
    PID    int    `json:"pID,omitempty"`
    PTitle string `json:"pTitle"`
    PDesc  string `json:"pDesc"`
    PPwd   string `json:"pPwd,omitempty"`
}

func main() {
    u := Paper{PTitle: "Title 1", PDesc: "Desc 1"}
    b, _ := json.Marshal(u)

    fmt.Println(string(b))
}

Печать: {"pTitle": "Заголовок 1", "pDesc": "Desc 1"}

Единственная проблема в том, что если PID явно равен 0, он все равно будет его опускать.

Как:

Paper {PTitle: "Заголовок 1", PDesc: "Desc 1", PID: 0} Тогда он все равно будет печатать {"pTitle": "Заголовок 1", "pDesc": "Desc 1"}

Другой способ сделать это, используя встроенный тип:

Обратите внимание, что встроенный тип должен быть указателем, чтобы он мог быть равен нулю, а omitempty может исключить его.

type Paper struct {
    PID    int    `json:"pID"`    
    PPwd   string `json:"pPwd"`
}

type BriefPaper struct {    
    PTitle string `json:"pTitle"`
    PDesc  string `json:"pDesc"`
    *Paper `json:",omitempty"`  
}

func main() {
    u := BriefPaper{PTitle: "Title 1", PDesc: "Desc 1"}
    b, _ := json.Marshal(u)

    fmt.Println(string(b))
}

Печать: {"pTitle": "Заголовок 1", "pDesc": "Desc 1"}

Если требуется вложенная внутренняя структура для бумаги, пометьте ее как * Paper json:"paper,omitempty"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...