C# Json.net:如何在反序列化期间检测属性是否处于输入状态?
我有以下课程:C# Json.net:如何在反序列化期间检测属性是否处于输入状态?,c#,.net,json,serialization,json.net,C#,.net,Json,Serialization,Json.net,我有以下课程: [DataContract] public class MyMessage { [DataMember(IsRequired = false)] public string Foo { get; set; } [DataMember(IsRequired = false)] public string Bar { get; set; } public void NotifyPropertyFound( string propName )
[DataContract]
public class MyMessage
{
[DataMember(IsRequired = false)]
public string Foo { get; set; }
[DataMember(IsRequired = false)]
public string Bar { get; set; }
public void NotifyPropertyFound( string propName )
{
...
}
}
我需要反序列化以下Json输入:
{ "Foo": null,
"Melda": 123
}
我需要反序列化程序调用NotifyPropertyFound方法两次:一次调用类中的参数Foo,一次调用我没有的参数Melda
我正在使用IContractResolver和JsonConverter,但它们似乎都没有提供调用NotifyPropertyFound方法的机会。有什么想法吗
编辑
我可以使用IValueProvider检测Foo。但是我仍然需要检测Melda。也许您可以将属性更改为由私有字段而不是自动属性支持。然后,您可以尝试在默认反序列化程序调用的setter中调用该方法
另一种选择是编写自己的反序列化程序 您可以使用自定义JsonConverter获得所需的结果,如下所示:
class MyMessageConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(MyMessage));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
MyMessage msg = jo.ToObject<MyMessage>();
foreach (JProperty prop in jo.Properties())
{
msg.NotifyPropertyFound(prop.Name);
}
return msg;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
使用私有字段可以检测Foo,但我需要检测像示例中的Melda这样的无关属性。这是由JavaScript发起的吗?如果是这样的话,您可以在将javascript对象推送到服务器之前在javascript对象中运行检查。谢谢,但它不是由javascript启动的。这是一个RESTAPI,它接收一个JSON blob作为输入。对于那个在没有解释任何问题的情况下立即投反对票的家伙,你真的帮了大忙。我希望你现在快乐。
class Program
{
static void Main(string[] args)
{
string json = @"{ ""Foo"": null, ""Melda"": 123 }";
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new MyMessageConverter());
MyMessage msg = JsonConvert.DeserializeObject<MyMessage>(json, settings);
}
}
[DataContract]
public class MyMessage
{
[DataMember(IsRequired = false)]
public string Foo { get; set; }
[DataMember(IsRequired = false)]
public string Bar { get; set; }
public void NotifyPropertyFound(string propName)
{
// Write to the console each time this method is called
Console.WriteLine(propName);
}
}
Foo
Melda