2016-12-02 23 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

    それは素晴らしいですが、FirstNameを設定するとDictionnaryに追加する必要があるため、プロパティでJsonPropertyを使用できません。だから、私はちょうどデータオブジェクトのJsonExtensionDataを使用しました。 –

    +0

    OK、私はすべての値を辞書に入れるのか、それとも未知のものにするのかはわかりませんでした。 –

    0

    レコードクラスにJsonProperty属性を追加できます。

    public class Record 
    { 
        public Dictionary<string, string> Data { get; set; } 
    
        [JsonProperty(PropertyName = "f_EMail")] 
        public string Email 
        { 
         get;set; 
        }  
    
        ... 
    } 
    
    +0

    私はフィールド名を知っているだけで動作しますが、辞書内にわからないものもすべて挿入する必要があります。 –

    関連する問題