package jsons import ( "strconv" "encoding/json" ) // The package implements basic types // to be used in structures that can be parsed // from the poorly structured JSON. (Like ones that make IDs strings) func parseInt(str string, n int) (int64, error) { if str == "" { return 0, EmptyStringErr } if str[0] == '"' { str = str[1:] } if str == "" { return 0, EmptyStringErr } if str[len(str)-1] == '"' { str = str[:len(str)-1] } v, err := strconv.ParseInt(str, 10, n) if err != nil { return 0, err } return v, nil } type Int int func(ji *Int) UnmarshalJSON(bts []byte) error { v, err := parseInt(string(bts), 32) if err != nil { return err } *ji = Int(v) return nil } type Int64 int64 func(ji *Int64) UnmarshalJSON(bts []byte) error { v, err := parseInt(string(bts), 64) if err != nil { return err } *ji = Int64(v) return nil } type ArrayMap[V any] map[int] V func (jam *ArrayMap[V]) UnmarshalJSON(bts []byte) error { *jam = make(ArrayMap[V]) am := *jam j := map[string] json.RawMessage{} err := json.Unmarshal(bts, &j) if err != nil { return err } v := new(V) for jk, jv := range j { // Getting the key from string. k, err := strconv.ParseInt(jk, 10, 32) if err != nil { return err } err = json.Unmarshal([]byte(jv), v) if err != nil { return err } am[int(k)] = *v } return nil }