2016-12-02 216 views
2

假設我有此JSON:反序列化JSON到次級對象

{ 
    "Success": true, 
    "Records": [ 
     { 
      "f_EMail": "[email protected]", 
      "f_FirstName": "firstname", 
      "f_LastName": "lastname", 
      "f_Country": null 
     }, 
     { 
      "f_EMail": "[email protected]", 
      "f_FirstName": "firstname2", 
      "f_LastName": "lastname2", 
      "f_Country": null 
     } 
    ] 
} 

我的類看起來是這樣的:

public class Result 
{ 
    public bool Success { get; set; } 

    public IEnumrable<Dictionary<string, string>> Records { get; set; } 
} 

一切正常。但是我想寫一些有點不同的值,並將值放在Record.Data之內,如下所示。我需要找到一種方法來讀取和寫入這個模型,因爲有些值是衆所周知的,我想直接訪問它們。

public class Result 
{  
    public bool Success { get; set; } 

    public IEnumerable<Record> Records { get; set; } 
} 

public class Record 
{ 
    public Dictionary<string, string> Data { get; set; } 

    public string Email 
    { 
     get 
     { 
      return Data[KnownRecordField.Email]; 
     } 
    } 

    public string FirstName 
    { 
     get 
     { 
      return Data[KnownRecordField.FirstName]; 
     } 
    } 

    ... 
} 

我該怎麼做?

+2

我不認爲你可以直接反序列化的新對象以不同的格式。反序列化後,您將不得不創建一個映射。 –

回答

1

如果你願意申報你的字典作爲Dictionary<string, object>而不是Dictionary<string, string>你可以採取的Json.Net的「Extension Data」的功能優勢,處理這個問題。

  • [JsonExtensionData]屬性標記詞典。
  • 爲所有已知值創建屬性,併爲它們提供與其JSON屬性名稱對應的屬性[JsonProperty]

衆所周知的JSON屬性將被反序列化到它們各自的類中,而所有其餘的值將被放入字典中。

public class Record 
{ 
    [JsonExtensionData] 
    public Dictionary<string, object> Data { get; set; } 

    [JsonProperty("f_EMail")] 
    public string Email { get; set; } 

    [JsonProperty("f_FirstName")] 
    public string FirstName { get; set; } 

    ... 
} 

小提琴:https://dotnetfiddle.net/hGZ1V7


如果你想所有值進入詞典(不只是未知的),你仍然可以使用[JsonExtensionData]屬性,然後使用單獨的屬性直接從字典中讀取和寫入衆所周知的值。確保使用[JsonIgnore]標記屬性以避免序列化期間可能發生的衝突。

public class Record 
{ 
    [JsonExtensionData] 
    public Dictionary<string, object> Data { get; set; } 

    [JsonIgnore] 
    public string Email 
    { 
     get { return GetDataValue(KnownRecordField.Email); } 
     set { Data[KnownRecordField.Email] = value; } 
    } 

    [JsonIgnore] 
    public string FirstName 
    { 
     get { return GetDataValue(KnownRecordField.FirstName); } 
     set { Data[KnownRecordField.FirstName] = value; } 
    } 

    // use this method to avoid an exception if the well-known value 
    // isn't present in the dictionary 
    private string GetDataValue(string key) 
    { 
     object value; 
     return Data.TryGetValue(key, out value) && value != null ? value.ToString() : null; 
    } 
} 

public static class KnownRecordField 
{ 
    public static readonly string Email = "f_EMail"; 
    public static readonly string FirstName = "f_FirstName"; 
} 

小提琴:https://dotnetfiddle.net/I04oMM

+0

它工作的很好,但我不能在屬性上使用JsonProperty,因爲當我設置FirstName時,它必須將它添加到Dictionnary中。所以我只是在Data對象上使用了JsonExtensionData。 –

+0

好的,我不確定你是否想把所有的價值都寫進字典或只是未知的價值。 –

0

您可以在記錄類中添加JsonProperty屬性。

public class Record 
{ 
    public Dictionary<string, string> Data { get; set; } 

    [JsonProperty(PropertyName = "f_EMail")] 
    public string Email 
    { 
     get;set; 
    }  

    ... 
} 
+0

它只有在我知道字段名稱的情況下才有效,但我也需要在Dictionary中插入所有我不知道的字段。 –