C# Newtonsoft Json.NET反序列化Json字符串中的仅设置值

C# Newtonsoft Json.NET反序列化Json字符串中的仅设置值,c#,json,json.net,json-deserialization,C#,Json,Json.net,Json Deserialization,Newtonsoft Json.NET反序列化程序是否可以仅分配在Json字符串中找到的值,即使这些值是默认值且分配为空值? 使用下面的示例,我试图查找在设置属性时添加到_values字典中的值。在Json 1中,所有值都被设置并保存到数据库中。在Json 2中,设置标识符并将值更新为null。在反序列化之后,我将在数据库中找到值,并且只想用字典中的值更新字段。这个问题是,赋值null实际上并没有设置值,因为它是默认值 到目前为止,我似乎能够忽略默认值,但Value:null被忽略。或者我可以包

Newtonsoft Json.NET反序列化程序是否可以仅分配在Json字符串中找到的值,即使这些值是默认值且分配为空值?

使用下面的示例,我试图查找在设置属性时添加到_values字典中的值。在Json 1中,所有值都被设置并保存到数据库中。在Json 2中,设置标识符并将值更新为null。在反序列化之后,我将在数据库中找到值,并且只想用字典中的值更新字段。这个问题是,赋值null实际上并没有设置值,因为它是默认值

到目前为止,我似乎能够忽略默认值,但Value:null被忽略。或者我可以包括默认值,并且名称被分配为null,即使它不在Json中

我知道我可以补充

[JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)]
但是关于序列化,我想忽略默认值

反序列化程序代码

var jsonSerializer = new JsonSerializer();
var widget = jsonSerializer.Deserialize<Widget>(jsonString);
var serializer = new JsonSerializer
{
     DefaultValueHandling = DefaultValueHandling.Ignore
};
var jsonString = serializer.Serialize(widget);
示例类

public class Widget
{
    [JsonProperty]
    public int Id { get { return Get<int>("Id"); } set { Set("Id", value); } }

    [JsonProperty]
    public string Name { get { return Get<string>("Name"); } set { Set("Name", value); } }

    [JsonProperty]
    public string Value { get { return Get<string>("Value"); } set { Set("Value", value); } }

    private Dictionary<sting, object> _values = new Dictionary<sting, object>();
    private object Get<T>(string name)
    {
        if (_values.TryGetValue(name, out value))
            return (T)value;
        else
            return default(T);
    }
    private void Set(string name, object value)
    {
        _values[name] = value;
    }
}
示例Json 2

{
    "Id": 6
    "Value": null
}

您可以使用ShouldSerialize方法,例如

bool ShouldSerializeName() {
    return _values.ContainsKey("Name");
}

bool ShouldSerializeValue() {
    return _values.ContainsKey("Value");
}

不漂亮,但应该有用。另一个选项是自定义序列化程序。

首先,您如何将JSON反序列化到什么位置?我真的不明白你想做什么。你可能想看看。这听起来像是你要解决的问题。它使用
serializer.PopulateObject
进行部分更新。因此,策略是:加载现有对象,使用PopulateObject对其进行修补,然后将该对象保存回您的数据存储。需要添加[JsonProperty(DefaultValueHandling=DefaultValueHandling.Include)]进行反序列化,并添加这些方法进行序列化。问题是,我的项目中有500多处房产。可能需要使用IContractResolver执行此操作。
bool ShouldSerializeName() {
    return _values.ContainsKey("Name");
}

bool ShouldSerializeValue() {
    return _values.ContainsKey("Value");
}