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