(pg expr.TokenPager, jh u.JsonHelper)
| 2133 | } |
| 2134 | } |
| 2135 | func parseJsonKeyValue(pg expr.TokenPager, jh u.JsonHelper) error { |
| 2136 | if pg.Cur().T != lex.TokenIdentity { |
| 2137 | return pg.ErrMsg("Expected json key/identity") |
| 2138 | } |
| 2139 | key := pg.Cur().V |
| 2140 | pg.Next() |
| 2141 | switch pg.Cur().T { |
| 2142 | case lex.TokenColon: |
| 2143 | pg.Next() |
| 2144 | switch pg.Cur().T { |
| 2145 | case lex.TokenLeftBrace: // { |
| 2146 | obj := make(u.JsonHelper) |
| 2147 | if err := ParseJsonObject(pg, obj); err != nil { |
| 2148 | return err |
| 2149 | } |
| 2150 | jh[key] = obj |
| 2151 | case lex.TokenLeftBracket: // [ |
| 2152 | list, err := ParseJsonArray(pg) |
| 2153 | if err != nil { |
| 2154 | return err |
| 2155 | } |
| 2156 | jh[key] = list |
| 2157 | case lex.TokenValue: |
| 2158 | jh[key] = pg.Cur().V |
| 2159 | pg.Next() |
| 2160 | case lex.TokenBool: |
| 2161 | bv, err := strconv.ParseBool(pg.Cur().V) |
| 2162 | if err != nil { |
| 2163 | return err |
| 2164 | } |
| 2165 | jh[key] = bv |
| 2166 | pg.Next() |
| 2167 | case lex.TokenInteger: |
| 2168 | iv, err := strconv.ParseInt(pg.Cur().V, 10, 64) |
| 2169 | if err != nil { |
| 2170 | return err |
| 2171 | } |
| 2172 | jh[key] = iv |
| 2173 | pg.Next() |
| 2174 | case lex.TokenFloat: |
| 2175 | fv, err := strconv.ParseFloat(pg.Cur().V, 64) |
| 2176 | if err != nil { |
| 2177 | return err |
| 2178 | } |
| 2179 | jh[key] = fv |
| 2180 | pg.Next() |
| 2181 | default: |
| 2182 | return pg.ErrMsg("Expected json { or [") |
| 2183 | } |
| 2184 | return nil |
| 2185 | default: |
| 2186 | return pg.ErrMsg("Expected json colon") |
| 2187 | } |
| 2188 | } |
| 2189 | |
| 2190 | func ParseJsonArray(pg expr.TokenPager) ([]interface{}, error) { |
| 2191 | if pg.Cur().T != lex.TokenLeftBracket { |
no test coverage detected