2017-05-01 55 views
0

我有兩種格式的JSON,我想將其反序列化爲一個類。 我知道我們不能將兩個[JsonProperty]屬性應用於一個屬性。將多個JsonProperty名稱分配給單個屬性

可以請你給我一種方法來實現這一點。

 string json1 = @" { 
          'field1': '123456789', 
          'specifications': { 
                'name1': 'HFE' 
               } 
          }"; 

     string json2 = @" { 
      'field1': '123456789', 
      'specifications': { 
            'name2': 'HFE' 
           } 
          }"; 


public class Specifications 
{ 
    [JsonProperty("name1")] 
    public string CodeModel { get; set; } 
} 

public class ClassToDeserialize 
{ 
    [JsonProperty("field1")] 
    public string Vin { get; set; } 

      [JsonProperty("specification")] 
    public Specifications Specifications { get; set; }   
} 

我想要name1和name2都反序列化爲規範類的name1屬性。

+0

這似乎是一個設計問題。但是,如果你想要這樣做,你可以編寫一個自定義的json轉換器,並將這兩個名稱映射到name1。這裏是一個這樣的轉換器的例子:http://stackoverflow.com/questions/36233759/web-api-2-custom-data-type-json-serialization/36243575#36243575 –

+0

按照這裏的步驟... http ://stackoverflow.com/a/19885911/2445471 – khaled4vokalz

+0

@Khanh TO是的我知道這有點奇怪的要求。實際上我們從兩個不同來源獲得數據,並且都有差異格式的數據。我們試圖做的是將其映射到一個通用的格式。 即將到json轉換器部分我沒有看到任何嵌套類字段可以映射到兩個不同名稱的示例。 如果你可以幫忙,這將是非常好的。提前致謝。 –

回答

11

一個簡單的解決方案,它不需要轉換:只是第二,私有財產添加到您的類,有[JsonProperty("name2")]標記它,並將它設置第一個屬性:

public class Specifications 
{ 
    [JsonProperty("name1")] 
    public string CodeModel { get; set; } 

    [JsonProperty("name2")] 
    private string CodeModel2 { set { CodeModel = value; } } 
} 

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

+0

你真棒:) –

+0

很高興我能幫忙。 –

+0

非常好,謝謝! –

0

欺騙定製JsonConverter爲我工作。 感謝@ khaled4vokalz,@Khanh TO

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     object instance = objectType.GetConstructor(Type.EmptyTypes).Invoke(null); 
     PropertyInfo[] props = objectType.GetProperties(); 

     JObject jo = JObject.Load(reader); 
     foreach (JProperty jp in jo.Properties()) 
     { 
      if (string.Equals(jp.Name, "name1", StringComparison.OrdinalIgnoreCase) || string.Equals(jp.Name, "name2", StringComparison.OrdinalIgnoreCase)) 
      { 
       PropertyInfo prop = props.FirstOrDefault(pi => 
       pi.CanWrite && string.Equals(pi.Name, "CodeModel", StringComparison.OrdinalIgnoreCase)); 

       if (prop != null) 
        prop.SetValue(instance, jp.Value.ToObject(prop.PropertyType, serializer)); 
      } 
     } 

     return instance; 
    } 
相關問題