2017-05-01 47 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; 
    } 
相关问题