public object Deserialize(string text, JsonTable table) { var type = table.GetType().GetGenericArguments()[0]; var bindingFlags = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance; var properties = type .GetProperties(bindingFlags) .Where(p => p.GetCustomAttributes(true).Any(pp => pp is Newtonsoft.Json.JsonIgnoreAttribute) == false) .Select(p => new { PropertyInfo = p, IsVirtual = type.GetMethod("get_" + p.Name).IsVirtual }) .ToArray(); var items = (JArray)Newtonsoft.Json.JsonConvert.DeserializeObject(text); var newList = new List <object>(); foreach (var item in items) { var newInstance = Activator.CreateInstance(type); foreach (var property in properties) { if (property.IsVirtual == false) { var jvalue = (JValue)item[property.PropertyInfo.Name]; object value; if (jvalue.Type == JTokenType.Integer) { value = (Int32)(Int64)jvalue.Value; } else { value = jvalue.Value; } property.PropertyInfo.SetValue(newInstance, value); } else { var proxy = Activator.CreateInstance(property.PropertyInfo.PropertyType); property.PropertyInfo.SetValue(newInstance, proxy); var idProperty = property.PropertyInfo.PropertyType.GetProperty("Id", bindingFlags); var jsonValue = (JValue)item[property.PropertyInfo.Name + "_Fk" + property.PropertyInfo.PropertyType.Name]; idProperty.SetValue(proxy, (Int32)(Int64)jsonValue.Value); table.Proxies.Add(proxy); } } newList.Add(newInstance); } return(newList); }
public string Serialize(JsonTable table) { var bindingFlags = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance; var type = table.GetType().GetGenericArguments()[0]; var properties = type .GetProperties(bindingFlags) .Where(p => p.GetCustomAttributes(true).Any(pp => pp is Newtonsoft.Json.JsonIgnoreAttribute) == false) .Select(p => new { PropertyInfo = p, IsVirtual = type.GetMethod("get_" + p.Name).IsVirtual }) .ToArray(); var list = new List <Dictionary <string, object> >(); foreach (var item in table.Cast <object>()) { var dict = new Dictionary <string, object>(); foreach (var property in properties) { if (property.IsVirtual == false) { dict[property.PropertyInfo.Name] = property.PropertyInfo.GetValue(item); } else { var foreignIdProperty = property.PropertyInfo.PropertyType.GetProperty("Id", bindingFlags); var propertyValue = property.PropertyInfo.GetValue(item); dict[property.PropertyInfo.Name + "_Fk" + property.PropertyInfo.PropertyType.Name] = foreignIdProperty.GetValue(propertyValue); } } list.Add(dict); } return(Newtonsoft.Json.JsonConvert.SerializeObject(list, Newtonsoft.Json.Formatting.Indented)); }