| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package int64support
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "strconv"
- )
- var (
- _ = json.Marshaler(new(Object))
- _ = json.Unmarshaler(new(Object))
- )
- func (o *Object) MarshalJSON() ([]byte, error) {
- if o.OptionalNumber == nil {
- return ([]byte)("{}"), nil
- }
- return ([]byte)(fmt.Sprintf("{\"optional_number\": %d}", *o.OptionalNumber)), nil
- }
- func (o *Object) UnmarshalJSON(b []byte) error {
- var (
- trim = func(v []byte) []byte { return bytes.Trim(v, " \n\r\t") }
- strip = func(v []byte, first, last byte) ([]byte, error) {
- x := len(v)
- if x < 2 || v[0] != first || v[x-1] != last {
- return nil, fmt.Errorf("failed to strip %q and %q from byte sequence", first, last)
- }
- return v[1 : x-1], nil
- }
- )
- b, err := strip(trim(b), '{', '}')
- if err != nil {
- return err
- }
- // poor man parser: assume the only commas appear between JSON key-value pairs,
- // and that object hierarchy is flat
- for xf, f := range bytes.Split(b, ([]byte)(",")) {
- parts := bytes.SplitN(f, ([]byte)(":"), 2)
- if x := len(parts); x != 2 {
- if xf == 0 && (x == 0 || (x == 1 && len(trim(parts[0])) == 0)) {
- return nil // empty object
- }
- return fmt.Errorf("failed to parse field-value seperator char ':'")
- }
- fieldName, err := strip(trim(parts[0]), '"', '"')
- if err != nil {
- return err
- }
- if string(fieldName) != "optional_number" {
- continue // ignore unknown field
- }
- fieldValue := trim(parts[1])
- v, err := strconv.ParseInt(string(fieldValue), 10, 64)
- if err != nil {
- return err
- }
- o.OptionalNumber = &v
- break
- }
- return nil
- }
|