2016-09-30 141 views
1

是否有可能僅由Newtonsoft Json.NET反序列化程序分配的Json字符串中找到的值即使分配了默認值和空值?Newtonsoft Json.NET反序列化僅設置Json字符串中的值

使用下面的示例,我試圖找到設置屬性時添加到_values字典的值。在Json 1中,所有值都被設置並保存到數據庫中。在Json 2中,標識符被設置並且Value被更新爲空。反序列化後,我會在數據庫中查找值,並且只想更新字典中具有值的字段。這個問題是,分配null實際上並沒有設置該值,因爲它是默認值。

截至目前,我似乎可以忽略默認值,但是Value:null被忽略。或者我可以包含默認值,即使它不在Json中,名稱也會被賦值爲null。

我知道我可以添加...

[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 
} 
+1

你是如何反序列化JSON的,首先是什麼?我真的不遵循你想要做的事情。 –

+0

您可能想看看[使用Json.NET修改現有對象與新的部分JSON數據](http://stackoverflow.com/q/27511675/10263)。這聽起來像是你試圖解決的同樣的問題。它使用'serializer.PopulateObject'來進行部分更新。因此,策略是:加載現有對象,使用PopulateObject對其進行修補,然後將對象保存回數據存儲。 –

回答

1

你可能利用ShouldSerialize方法,例如

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

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

不漂亮,但它應該工作。另一種選擇是自定義序列化器。

+0

我明白你要去哪裏了。需要爲反序列化添加[JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)]和這些用於序列化的方法。事情是,我的項目中有500多處房產。可能需要使用IContractResolver完成此操作。 –

相關問題