| 101 | } |
| 102 | |
| 103 | func (dec *Decoder) decodeObjectNull(v interface{}) (int, error) { |
| 104 | // make sure the value is a pointer |
| 105 | vv := reflect.ValueOf(v) |
| 106 | vvt := vv.Type() |
| 107 | if vvt.Kind() != reflect.Ptr || vvt.Elem().Kind() != reflect.Ptr { |
| 108 | dec.err = ErrUnmarshalPtrExpected |
| 109 | return 0, dec.err |
| 110 | } |
| 111 | for ; dec.cursor < dec.length || dec.read(); dec.cursor++ { |
| 112 | switch dec.data[dec.cursor] { |
| 113 | case ' ', '\n', '\t', '\r', ',': |
| 114 | case '{': |
| 115 | elt := vv.Elem() |
| 116 | n := reflect.New(elt.Type().Elem()) |
| 117 | elt.Set(n) |
| 118 | var j UnmarshalerJSONObject |
| 119 | var ok bool |
| 120 | if j, ok = n.Interface().(UnmarshalerJSONObject); !ok { |
| 121 | dec.err = dec.makeInvalidUnmarshalErr((UnmarshalerJSONObject)(nil)) |
| 122 | return 0, dec.err |
| 123 | } |
| 124 | keys := j.NKeys() |
| 125 | dec.cursor = dec.cursor + 1 |
| 126 | // if keys is zero we will parse all keys |
| 127 | // we run two loops for micro optimization |
| 128 | if keys == 0 { |
| 129 | for dec.cursor < dec.length || dec.read() { |
| 130 | k, done, err := dec.nextKey() |
| 131 | if err != nil { |
| 132 | return 0, err |
| 133 | } else if done { |
| 134 | return dec.cursor, nil |
| 135 | } |
| 136 | err = j.UnmarshalJSONObject(dec, k) |
| 137 | if err != nil { |
| 138 | dec.err = err |
| 139 | return 0, err |
| 140 | } else if dec.called&1 == 0 { |
| 141 | err := dec.skipData() |
| 142 | if err != nil { |
| 143 | return 0, err |
| 144 | } |
| 145 | } else { |
| 146 | dec.keysDone++ |
| 147 | } |
| 148 | dec.called &= 0 |
| 149 | } |
| 150 | } else { |
| 151 | for (dec.cursor < dec.length || dec.read()) && dec.keysDone < keys { |
| 152 | k, done, err := dec.nextKey() |
| 153 | if err != nil { |
| 154 | return 0, err |
| 155 | } else if done { |
| 156 | return dec.cursor, nil |
| 157 | } |
| 158 | err = j.UnmarshalJSONObject(dec, k) |
| 159 | if err != nil { |
| 160 | dec.err = err |