2015-12-22 188 views
2

定製JsonConverter我有一個JSON對象是這樣的:有沒有辦法寫每個對象

{"company": "My Company", 
"companyStart" : "2015/01/01", 
"employee" : 
    { "name" : "john doe", 
     "startDate" : 1420434000000 } } 

我的JSON對象是這樣的:

public class Company { 
    public string company; 
    public DateTime companyStart; 
    public Employee employee; 
} 

public class Employee { 
    public string name; 
    public DateTime startDate; 
} 

我的原代碼反序列化這樣的

JsonConvert.DeserializeObject<Company>(jsonString); 

此代碼毫無問題地轉換Company.companyStart,但是當它到達Employee.startDate時它不會知道如何處理龍。

This post向我展示瞭如何創建自定義JsonConverter以將長轉換爲DateTime,但正如您在我的案例中所見,這會給我轉換Company.companyStart到DateTime帶來麻煩。

所以...我想在做這樣的事情的:

public class Company : JsonBase { 
    ... 
} 

public class Employee : JsonBase { 
    ... 
    Employee() { Converter = new CustomDateConverter(); } 
} 

public class JsonBase { 
    private JsonConverter converter; 
    [JsonIgnore] 
    public JsonConverter Converter => converter ?? (converter = new StandardConverter()); 
} 

JsonBase將包含兩種標準轉換器或

,並在我的代碼我會轉換是這樣的:

public T CreateJsonObject<T>() where T : JsonBase { 
    JsonBase json = (T) Activator.CreateInstance(typeof (T)); 
    JsonConvert.DeserializeObject<T>(jsonString, json.Converter); 
} 

問題是,這不起作用,因爲這種方法將簡單地使用最頂級的轉換器來轉換一切,而不是每個對象使用轉換器。

有沒有辦法使用每個對象的轉換器?或者也許有更好的方法來做到這一點。

+0

Ooops。我在我的文章中遺漏了一些詞:「JsonBase將包含標準轉換器或自定義轉換器」 – Steven

+0

轉到這裏-http://json2csharp.com/並粘貼您的json它會爲您生成一個C#類。 – MethodMan

+1

很酷的工具。但我需要將「startDate」作爲DateTime,而不是那麼長。 – Steven

回答

7

如何適應你寫,瞭解這兩種格式的自定義轉換器:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
{ 
    if (reader.ValueType == typeof(string)) 
    { 
     return DateTime.Parse((string)reader.Value); 
    } 
    else if (reader.ValueType == typeof(long)) 
    { 
     return new DateTime(1970, 1, 1).AddMilliseconds((long)reader.Value); 
    } 
    throw new NotSupportedException(); 
} 

另外,您可以通過與JsonConverter屬性裝飾它的轉換隻適用於模型的特定屬性

public class Employee 
{ 
    public string name; 

    [JsonConverter(typeof(MyConverter))] 
    public DateTime startDate; 
} 

這樣你就不需要在全局註冊轉換器,它不會搞亂其他標準的日期格式。

+0

一如既往,我在設計我的解決方案。你的JsonConverter屬性非常簡單。謝謝! – Steven

相關問題