Newtonsoft Json.NET反序列化只设置Json字符串中的值
本文关键字:Json 字符串 NET 反序列化 Newtonsoft 设置 | 更新日期: 2023-09-27 18:09:55
是否可能只有在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");
}
不漂亮,但应该可以工作。另一个选项是自定义序列化器。