Skip to content

Instantly share code, notes, and snippets.

@mantyr
Created February 26, 2018 18:05
Show Gist options
  • Save mantyr/96a1c28ae8e58ac3ca30ede6b81ec96c to your computer and use it in GitHub Desktop.
Save mantyr/96a1c28ae8e58ac3ca30ede6b81ec96c to your computer and use it in GitHub Desktop.
Сохраняем сортировку параметров в произвольном объекте через map[string]Param
// https://play.golang.org/p/THhs6i482cA
package jsonschema
import (
"encoding/json"
"strings"
"io"
)
// Properties это перечень полей объекта
type Properties map[string]Param
// PropertiesList это список полей объекта
type PropertiesList []Param
// UnmarshalJSON необходим для сохранения порядка полей в объекте
func (p *Properties) UnmarshalJSON(data []byte) error {
if (*p) == nil {
(*p) = make(map[string]Param)
}
dec := json.NewDecoder(strings.NewReader(string(data)))
order := int64(0)
for {
token, err := dec.Token()
if err == io.EOF {
return nil
}
switch keyName := token.(type) {
case json.Delim:
case string:
param := Param{
Order: order,
KeyName: keyName,
}
order++
err = dec.Decode(&param)
if err != nil {
return err
}
(*p)[keyName] = param
}
}
return nil
}
// Params возвращает список полей объекта
func (p Properties) Params() PropertiesList {
params := make(PropertiesList, len(p))
i := 0
for _, param := range p {
params[i] = param
i++
}
return params
}
// Len возвращает количество элементов
func (p PropertiesList) Len() int {
return len(p)
}
// Swap меняет местами два элемента
func (p PropertiesList) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
// Less сравнивает два элемента для сортировки
func (p PropertiesList) Less(i, j int) bool {
return p[i].Order < p[j].Order
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment