2015-01-16 86 views
0

我有一個類,它包含一個DateTime屬性,我將其作爲WriteJson覆蓋中的數組寫入,並從JsonRead覆蓋中的數組中讀取,當從Divan沙發上保存/加載時。ReadJson和WriteJson與Divan couchdb一起使用,但不與Newtonsoft的Json.Net

我的問題是,我使用http將Newtonsoft.Json序列化的字符串傳遞給我的應用程序(在單獨的計算機上運行)的另一個實例,但Newtonsoft不會觸發我的覆蓋進行讀取/寫入。

相反,Newtonsoft試圖從字符串解析json屬性而不是數組(我認爲Newtonsoft的JsonConverter的默認行爲是?),我無法改變它的工作方式,因爲它需要能夠與來自舊系統的文件。

如何讓Json.net調用ReadJson和WriteJson的重寫?

public class JobResults : CouchDocument, ICanJson 
{ 
    [JsonProperty("update-datetime")] 
    public DateTime UpdateDateTime = new DateTime(1, 1, 1, 0, 0, 0); 

    [JsonProperty("job-ids")] 
    public JArray JobIDs = new JArray(); 


    #region CouchDocument Members 

     public override void WriteJson(JsonWriter writer) 
     { 
      base.WriteJson(writer); 

      writer.WritePropertyName("update-datetime"); 
      writer.WriteStartArray(); 
      writer.WriteValue(UpdateDateTime.Year); 
      writer.WriteValue(UpdateDateTime.Month); 
      writer.WriteValue(UpdateDateTime.Day); 
      writer.WriteValue(UpdateDateTime.Hour); 
      writer.WriteValue(UpdateDateTime.Minute); 
      writer.WriteValue(UpdateDateTime.Second); 
      writer.WriteEndArray(); 

      writer.WritePropertyName("job-ids"); 
      writer.WriteStartArray(); 
      foreach (string i in JobIDs) 
       writer.WriteValue(i); 
      writer.WriteEndArray(); 
     } 

     public override void ReadJson(JObject obj) 
     { 
      base.ReadJson(obj); 

      var dt = obj["update-datetime"].Value<JArray>(); 
      UpdateDateTime = new DateTime((int)dt[0], (int)dt[1], (int)dt[2], (int)dt[3], (int)dt[4], (int)dt[5]); 
      JobIDs = obj["job-ids"].Value<JArray>(); 
     } 

     #endregion 
} 
+0

hmm ...似乎是CouchDocument不繼承JsonConverter,並且事實上繼承了具有ReadJson和WriteJson方法的ICanJson。我無法更改我使用的Divan版本,也無法從ICanJson和JsonConverter繼承 –

回答

1

沒關係我知道了,我添加了JsonConverter屬性並指向不同的類。

[JsonConverter(typeof(Serializer))] 
public class JobResults : CouchDocument, ICanJson 
{ 
    [JsonProperty("update-datetime")] 
    public DateTime UpdateDateTime = new DateTime(1, 1, 1, 0, 0, 0); 

    [JsonProperty("job-ids")] 
    public JArray JobIDs = new JArray(); 
    ... 
} 

public class Serializer : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     ... 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     ... 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof(JobResults).IsAssignableFrom(objectType); 
    } 
} 
相關問題