// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Represents JSON data structure using native Go types: booleans, floats, // strings, arrays, and maps. package json import ( "container/vector"; "os"; ) // Decode a JSON string // Decode parses the string s as a JSON-syntax string and returns the // generic JSON object representation. The object representation is a tree // of Go data types. The data return value may be one of float64, string, // bool, nil, []interface{} or map[string]interface{}. The array and map // elements may in turn contain any of the types listed above and so on. // If Decode encounters a syntax error, it returns with err set to an // instance of ParseError. See ParseError documentation for details. func Decode(s string) (data interface{}, err os.Error) { jb := newDecoder(nil, nil); ok, errPos, errTok := Parse(s, jb); if ok { data = jb.Data() } else { err = &ParseError{Index: errPos, Token: errTok} } return; } type decoder struct { // A value being constructed. value interface{}; // Container entity to flush into. Can be either vector.Vector or // map[string]interface{}. container interface{}; // The index into the container interface. Either int or string. index interface{}; } func newDecoder(container interface{}, key interface{}) *decoder { return &decoder{container: container, index: key} } func (j *decoder) Int64(i int64) { j.value = float64(i) } func (j *decoder) Uint64(i uint64) { j.value = float64(i) } func (j *decoder) Float64(f float64) { j.value = float64(f) } func (j *decoder) String(s string) { j.value = s } func (j *decoder) Bool(b bool) { j.value = b } func (j *decoder) Null() { j.value = nil } func (j *decoder) Array() { j.value = new(vector.Vector) } func (j *decoder) Map() { j.value = make(map[string]interface{}) } func (j *decoder) Elem(i int) Builder { v, ok := j.value.(*vector.Vector); if !ok { v = new(vector.Vector); j.value = v; } if v.Len() <= i { v.Resize(i+1, (i+1)*2) } return newDecoder(v, i); } func (j *decoder) Key(s string) Builder { m, ok := j.value.(map[string]interface{}); if !ok { m = make(map[string]interface{}); j.value = m; } return newDecoder(m, s); } func (j *decoder) Flush() { switch c := j.container.(type) { case *vector.Vector: index := j.index.(int); c.Set(index, j.Data()); case map[string]interface{}: index := j.index.(string); c[index] = j.Data(); } } // Get the value built by this builder. func (j *decoder) Data() interface{} { switch v := j.value.(type) { case *vector.Vector: return v.Data() } return j.value; }