【发布时间】:2015-12-16 05:42:52
【问题描述】:
如何在使用 JSON.Net 进行序列化期间有条件地忽略字段和属性?
我不能从JsonIgnoreAttribute 继承,因为它是sealed 类。我该怎么办?
【问题讨论】:
-
你检查ScriptIgnore了吗?
-
@Kurubaran 是的,但我想有条件地忽略一个字段..
如何在使用 JSON.Net 进行序列化期间有条件地忽略字段和属性?
我不能从JsonIgnoreAttribute 继承,因为它是sealed 类。我该怎么办?
【问题讨论】:
您可以使用 JSON.NET 的 ShouldSerialize 语法。 JSON.NET 网站上有一个很好的例子:
http://www.newtonsoft.com/json/help/html/ConditionalProperties.htm
public class Employee
{
public string Name { get; set; }
public Employee Manager { get; set; }
public bool ShouldSerializeManager()
{
// don't serialize the Manager property if an employee is their own manager
return (Manager != this);
}
}
如果 ShouldSerialize 不符合您的需求,您可以使用 ContractResolvers 完全控制序列化:http://www.newtonsoft.com/json/help/html/ContractResolver.htm
【讨论】:
我找到了答案。我从JsonConverter 继承并创建一个新的转换器。
public class CustomJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var list = (IList)value;
JArray s = new JArray();
foreach (var item in list)
{
JToken token = JToken.FromObject(item);
JObject obj = new JObject();
foreach (JProperty prop in token)
{
if (prop.Name != "Title") // your logic here
obj.Add(prop);
}
s.Add(obj);
}
s.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
}
public override bool CanRead
{
get { return false; }
}
public override bool CanConvert(Type objectType)
{
return objectType != typeof(IList);
}
}
【讨论】: