Created
February 26, 2018 18:05
-
-
Save mantyr/96a1c28ae8e58ac3ca30ede6b81ec96c to your computer and use it in GitHub Desktop.
Сохраняем сортировку параметров в произвольном объекте через map[string]Param
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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(¶m) | |
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