| 278 | } |
| 279 | |
| 280 | func (store Store) treeBranchFromJSON(in []byte) (sops.TreeBranch, error) { |
| 281 | dec := json.NewDecoder(bytes.NewReader(in)) |
| 282 | // Decode numbers as json.Number instead of the default float64, then |
| 283 | // normalize each to int/float64 (see normalizeJSONNumber). The default |
| 284 | // float64 silently loses precision for integers larger than 2^53. |
| 285 | dec.UseNumber() |
| 286 | value, err := dec.Token() |
| 287 | if err != nil { |
| 288 | return nil, err |
| 289 | } |
| 290 | if delim, ok := value.(json.Delim); ok { |
| 291 | if delim.String() != "{" { |
| 292 | return nil, fmt.Errorf("SOPS only supports JSON files with a top-level object (starting with '{'), not arrays or other types. Got delimiter %s instead. To encrypt this file, wrap it in an object, e.g., {\"data\": [...]}", value) |
| 293 | } |
| 294 | } else { |
| 295 | v, nerr := normalizeJSONNumber(value) |
| 296 | if nerr != nil { |
| 297 | v = value |
| 298 | } |
| 299 | return nil, fmt.Errorf("SOPS only supports JSON files with a top-level object (starting with '{'), not other JSON types. Got %#v of type %T instead", v, v) |
| 300 | } |
| 301 | return store.treeBranchFromJSONDecoder(dec) |
| 302 | } |
| 303 | |
| 304 | func (store Store) reindentJSON(in []byte) ([]byte, error) { |
| 305 | var out bytes.Buffer |