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



是否可能只有在Json字符串中找到的值由Newtonsoft Json分配?. NET反序列化器,即使它们是默认值和空值被分配?

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

到目前为止,我似乎可以忽略默认值,但Value: 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 1

{
    "Id": 6,
    "Name": "Widget 1",
    "Value": "Blue"
}

示例Json 2

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

你可以使用ShouldSerialize方法,例如

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

不漂亮,但应该可以工作。另一个选项是自定义序列化器。

相关内容

  • 没有找到相关文章

最新更新