我最终使用了只写入“属性”列表中指定的参数的 JsonConverter。它比 ContractResolver 或格式化程序更低级别,但我认为不可能为特定类型配置任何一个。
public class ResourceConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(Resource));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
List<string> properties = new List<string>(new string[] { "Name", "Label" });
writer.WriteStartObject();
foreach (MemberInfo mi in value.GetType().GetMembers(BindingFlags.GetField | BindingFlags.Instance | BindingFlags.Public) )
{
PropertyInfo p = mi as PropertyInfo;
if (p != null && p.GetCustomAttributes(typeof(JsonIgnoreAttribute), true).Length == 0 && properties.Contains(p.Name))
{
writer.WritePropertyName(p.Name);
serializer.Serialize(writer, p.GetValue(value, new object[] { }));
}
}
writer.WriteEndObject();
}
}
这可以使用属性应用于类:
[JsonConverter(typeof(ResourceConverter))]
虽然这似乎是一个 hack,但我认为我应该使用合同解析器来获取要序列化的属性列表,而不是直接使用反射,但我不确定如何。