using System; using System.Collections; using System.Collections.Generic; namespace Top.Api.Parser { /// /// TOP JSON响应通用读取器。 /// public class TopJsonReader : ITopReader { private IDictionary json; public TopJsonReader(IDictionary json) { this.json = json; } public bool HasReturnField(object name) { return json.Contains(name); } public object GetPrimitiveObject(object name) { return json[name]; } public object GetReferenceObject(object name, Type type, DTopConvert convert) { IDictionary dict = json[name] as IDictionary; if (dict != null && dict.Count > 0) { return convert(new TopJsonReader(dict), type); } else { return null; } } public IList GetListObjects(string listName, string itemName, Type type, DTopConvert convert) { IList listObjs = null; IDictionary jsonMap = json[listName] as IDictionary; if (jsonMap != null && jsonMap.Count > 0) { IList jsonList = jsonMap[itemName] as IList; if (jsonList != null && jsonList.Count > 0) { Type listType = typeof(List<>).MakeGenericType(new Type[] { type }); listObjs = Activator.CreateInstance(listType) as IList; foreach (object item in jsonList) { if (typeof(IDictionary).IsAssignableFrom(item.GetType())) // object { IDictionary subMap = item as IDictionary; object subObj = convert(new TopJsonReader(subMap), type); if (subObj != null) { listObjs.Add(subObj); } } else if (typeof(IList).IsAssignableFrom(item.GetType())) // list or array { // TODO not support yet } else // string, bool, long, double, null, other { listObjs.Add(item); } } } } return listObjs; } } }