object ParseObject(Type typeHint) { var adapter = JsonAdapter.ForType(typeHint); var next = Peek(); if (next != '{') { Err("expected object literal"); } Consume(); var result = Activator.CreateInstance(typeHint); next = Peek(); while (next != '}') { var key = ParseString(); Consume(':'); var value = Parse(adapter.GetValueType(result, key)); adapter.SetKey(result, key, value); next = Peek(); if (next != '}') { Consume(','); } } Consume('}'); return(result); }
object ParseArray(Type typeHint) { var adapter = JsonAdapter.ForType(typeHint); var next = Peek(); if (next != '[') { Err("expected array literal"); } Consume(); var result = Activator.CreateInstance(GetWorkingType(typeHint)); int i = 0; next = Peek(); while (next != ']') { var value = Parse(adapter.GetValueType(result, i.ToString())); adapter.SetKey(result, i.ToString(), value); i++; next = Peek(); if (next != ']') { Consume(','); } } Consume(']'); if (typeHint.IsArray) { typeHint = typeHint.GetElementType(); var list = (IList)result; var array = Array.CreateInstance(typeHint, i); for (var j = 0; j < i; j++) { array.SetValue(Convert.ChangeType(list [j], typeHint), j); } return(array); } return(result); }
public void WriteValue(object value) { WriteCommaIfNecessary(); if (value == null) { buffer.Append("null"); } else if (value is string) { WriteString((string)value); } else if (value is ValueType) { // FIXME: enums? buffer.Append(value.ToString().ToLowerInvariant()); } else { JsonAdapter.ForType(value.GetType()).WriteJson(value, this); } next_needs_comma = true; }
public static void Register(Type type, JsonAdapter adapter) { lock (adapters) adapters [type] = adapter; }
public static void Register(Type type, JsonAdapter adapter) { if (adapter == null) throw new ArgumentNullException ("adapter"); lock (adapters) adapters.Insert (0, type, adapter); }