如图,
var jsonStr = returnList.ObjectToJsonString();
var newList = jsonStr.JsonStringToDynamic(new List<ReturnOrderSM>());
result.rows = newList;
反序列化后有两个ReturnID,一个值为0是父类的,另一个是一串数字子类的,也是想要用的,但是在Controller中
return Json(result, JsonRequestBehavior.AllowGet);
把对象返到JS中,就只剩一个值为0的ReturnID。
首先写一个JSON序列化设置的类,用于重写newtonsoft的底层序列方法
public class LimitPropsContractResolver : DefaultContractResolver
{
List<string> props = null;
bool retain;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="props">传入的属性数组</param>
/// <param name="retain">true:表示props是需要保留的字段 false:表示props是要排除的字段</param>
public LimitPropsContractResolver(List<string> props, bool retain = true)
{
//指定要序列化属性的清单
this.props = props;
this.retain = retain;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);
if (type.Name == "你的子类名称")//或用FullName,包含子类具体的命名空间,更加准确详细
{
//只保留清单有列出的属性
return list.Where(p =>
{
if (retain)
{
return props.Contains(p.PropertyName);
}
else
{
return !props.Contains(p.PropertyName);
}
}).ToList();
}
return list;//父类全部属性都序列化
}
在调用的时候即
List<string> props = new List<string>()
{
"ID",
...
}; //你要的子类的属性清单
var jSetting = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,//空值不序列化
ContractResolver = new LimitPropsContractResolver(props, true)//指定要序列化属性的清单(false则是序列化清单以外的其他所有属性)
};//写一个序列化设定
return JsonConvert.SerializeObject("你要序列化的对象", Formatting.None, jSetting);//执行序列化以及对应设定
当然这个方法写的只是一时的解决方案,你可以为自定义重写类LimitPropsContractResolver 扩展一些属性,比如指定一个叫做【子属性类的名称集合】,JsonProperty的属性判断(因为某个子属性类你可能定义了多个,只不过对象名不一样),每个类要求做哪些序列化,哪些不进行序列化等等。