2017-06-02 66 views
1

我有一個JSON類文件,其中包含三個類,它們都遵循這種結構:反序列化JSON不調用屬性方法

public class ManifestJSON : INotifyPropertyChanged 
{ 
    [JsonProperty("dataType")] 
    private string dataType; 

    public string DataType 
    { 
     get 
     { 
      return dataType; 
     } 
     set 
     { 
      if(dataType != value) 
      { 
       dataType = value; 
       RaisePropertyChanged("DataType"); 
      } 
     } 
    } 

    [JsonProperty("ttl")] 
    private int time_to_live; 

    public int Time_To_Live 
    { 
     get 
     { 
      return time_to_live; 
     } 
     set 
     { 
      if (time_to_live != value) 
      { 
       time_to_live = value; 
       RaisePropertyChanged("Time_To_Live"); 
      } 
     } 
    } 

    [JsonProperty("serial")] 
    private long serial; 

    public long Serial 
    { 
     get 
     { 
      return serial; 
     } 
     set 
     { 
      if (serial != value) 
      { 
       serial = value; 
       RaisePropertyChanged("Serial"); 
      } 
     } 
    } 

    [JsonProperty("modifiedIso8601")] 
    private string modifiedIso8601; 

    public string ModifiedIso8601 
    { 
     get 
     { 
      return modifiedIso8601; 
     } 
     set 
     { 
      if (modifiedIso8601 != value) 
      { 
       modifiedIso8601 = value; 
       RaisePropertyChanged("ModifiedIso8601"); 
      } 
     } 
    } 

    [JsonProperty("modifiedTimestamp")] 
    private long modifiedTimestamp; 

    public long ModifiedTimestamp 
    { 
     get 
     { 
      return modifiedTimestamp; 
     } 
     set 
     { 
      if (modifiedTimestamp != value) 
      { 
       modifiedTimestamp = value; 
       RaisePropertyChanged("ModifiedTimestamp"); 
      } 
     } 
    } 

    [JsonProperty("timezone")] 
    private string timezone; 

    public string Timezone 
    { 
     get 
     { 
      return timezone; 
     } 
     set 
     { 
      if (timezone != value) 
      { 
       timezone = value; 
       RaisePropertyChanged("Timezone"); 
      } 
     } 
    } 

    [JsonProperty("exports")] 
    private ObservableCollection<ManifestItem> manifest_Items; 

    public ObservableCollection<ManifestItem> Manifest_Items 
    { 
     get 
     { 
      return manifest_Items; 
     } 
     set 
     { 
      if (manifest_Items != value) 
      { 
       manifest_Items = value; 
       RaisePropertyChanged("Manifest_Items"); 
      } 
     } 
    } 

    //Event handling 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string property) 
    { 
     Console.WriteLine("Updated"); 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); 
    } 
} 

在另一類,我創建類型ManifestJSON的全局實例

public ManifestJSON manifestData; 

其通過使用所述方法DeserializeObject從Newtonsoft.json庫像這樣反序列化JSON字符串到該對象填充:

manifestData = JsonConvert.DeserializeObject<ManifestJSON>(JSONString)

這會成功填充ManifestJSON類,但是我的任何屬性方法或事件都不會觸發。我在這裏做錯了什麼?

+2

是因爲你的字段而不是你的屬性有'[JsonProperty()]'? –

+0

當你用新的ManifestJSON替換整個ManifestJSON時,你期望在你的UI中發生什麼? – mm8

+0

移動'[JsonProperty()]'似乎沒有幫助。 – Luke4792

回答

2

如果您想更新現有數據綁定ManifestJSON對象,你不應該取代它與一個新的對象,但反序列化JSON字符串轉換成新的對象,然後將現有manifestData對象的屬性:

var newData = JsonConvert.DeserializeObject<ManifestJSON>(JSONString); 
manifestData.DataType = newData.DataType; 
manifestData.Time_To_Live = newData.Time_To_Live; 
manifestData.Serial = newData.Serial; 
//... 
+0

這看起來像是最好的方法。有沒有辦法可以遍歷對象的所有屬性並將它們設置爲彼此相等,而不必手動執行? – Luke4792

+1

你應該能夠使用反射來做到這一點:https://stackoverflow.com/questions/4546381/enumerate-and-copy-properties-from-one-object-to-another-object-of-same-type。儘管這並不是必須的,特別是因爲你的班級似乎沒有那麼多的屬性。 – mm8