✨ Entry implements json.Unmarshaler
This commit is contained in:
parent
eff9a454f9
commit
0da5efcafe
2 changed files with 53 additions and 6 deletions
|
|
@ -179,6 +179,50 @@ func (e Entry) MarshalJSON() ([]byte, error) {
|
|||
return json.Marshal(out)
|
||||
}
|
||||
|
||||
func (e *Entry) UnmarshalJSON([]byte) error {
|
||||
func (e *Entry) UnmarshalJSON(in []byte) error {
|
||||
out := map[string]any{}
|
||||
dec := json.NewDecoder(bytes.NewReader(in))
|
||||
dec.UseNumber()
|
||||
err := dec.Decode(&out)
|
||||
if err != nil {
|
||||
return newParsingError(err)
|
||||
}
|
||||
title, ok := out["title"].(string)
|
||||
if !ok || title == "" {
|
||||
return ErrorMissingTitle
|
||||
}
|
||||
e.Title = title
|
||||
delete(out, "title")
|
||||
dates, ok := out["date"].(string)
|
||||
if !ok || dates == "" {
|
||||
return ErrorMissingDate
|
||||
}
|
||||
date, err := time.Parse(time.RFC3339, dates)
|
||||
if err != nil {
|
||||
return newParsingError(err)
|
||||
}
|
||||
e.Date = date
|
||||
delete(out, "date")
|
||||
for k, v := range out {
|
||||
m := Meta{Key: k}
|
||||
if vs, ok := v.(string); ok {
|
||||
if vd, err := time.Parse(time.RFC3339, vs); err == nil {
|
||||
m.Value = vd
|
||||
} else {
|
||||
m.Value = vs
|
||||
}
|
||||
} else if n, ok := v.(json.Number); ok {
|
||||
it, _ := n.Int64()
|
||||
fl, _ := n.Float64()
|
||||
if float64(it) == fl {
|
||||
m.Value = it
|
||||
} else {
|
||||
m.Value = fl
|
||||
}
|
||||
} else {
|
||||
m.Value = v
|
||||
}
|
||||
e.Fields = append(e.Fields, m)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue