自定义JSon转换为C#对象

时间:2015-06-21 19:10:27

标签: c# json json.net

我从第三方API获取JSon,这与我的类不匹配。

某些JSon属性不会被转换,其他人有不同的名称等等。

如何定义从JSON到C#对象的自定义转换。

这些是我在C#中的对象:

public class PropertyList {
  public Int32 Page { get; set; }
  public String[] ErrorMessages { get; set; }
  public List<Property> Properties { get; set; }
}

public class Property {
  public String Name { get; set; }
  public String Reference { get; set; }
  public String Region { get; set; }
  public IList<String> Features { get; set; }
  public String Id { get; set; }
  public Double Price { get; set; }
  public IList<String> ImagesUrls { get; set; }
}

这是我要转换的JSon数据:

{
  "page" : 0,
  "errorMessages" : [ ],
  "listings" : [ 
    {
      "data" : {
        "name" : "The name",
        "reference__c" : "ref1234",
        "region__c" : "London",
        "features__c" : "Garage;Garden;",
        "id" : "id1234",
        "price_pb__c" : 700000,
      },
      "media" : {
        "images" : [ 
          {
            "title" : "image1",
            "url" : "http://www.domain.com/image1"
          }, 
          {
            "title" : "image2",
            "url" : "http://www.domain.com/image2"
          }
        ]
      }
    }
    {
      NOTE: Other items
    }
  ]
}

我该怎么做?

更新1

使用Thiago建议我能够解析Page和ErrorMessages而不是属性。所以我创建了以下转换器:

public class PropertyResultConverter : JsonConverter {

  public override bool CanConvert(Type objectType) {
    return (objectType == typeof(PropertyResult));
  }

  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {

    JObject jo = JObject.Load(reader);
    PropertyResult propertyResult = jo.ToObject<PropertyResult>();
    propertyResult.Properties = jo.SelectToken("listings.data").ToObject<List<Property>>();
    return propertyResult;

  }

  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
    throw new NotImplementedException();
  }

}

但是当我尝试这个时,我收到以下错误:     发生了'System.NullReferenceException'类型的异常

在:

propertyResult.Properties = jo.SelectToken("listings.data").ToObject<List<Property>>();

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

Miguel,你试过http://www.newtonsoft.com/json吗?

您可以使用C#属性进行代码映射,例如下面的代码段。

public class PropertyList {
  [JsonProperty("page")]
  public Int32 Page { get; set; }
  [JsonProperty("errorMessages")]
   public String[] ErrorMessages { get; set; }
  [JsonProperty("listings")]
   public List<Property> Properties { get; set; }
}
public class Property {
  [JsonProperty("name")]
  public String Name { get; set; }
  [JsonProperty("reference__c")]
  public String Reference { get; set; }
  [JsonProperty("region__c")]
  public String Region { get; set; }
  [JsonProperty("features__c")]
  public IList<String> Features { get; set; }
  [JsonProperty("id")]
  public String Id { get; set; }
  [JsonProperty("price_pb__c")]
  public Double Price { get; set; }
  [JsonProperty("media")]
  public IList<String> ImagesUrls { get; set; }
}

我不确定IList是否会像你期望的那样工作。我相信你需要让它适应字典。

您可以查看API: http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm

更新

尝试使用以下代码段解析“数据”:

JObject jsonObject = JObject.Parse(json);
            IList<JToken> results = jsonObject["listings"]["data"].Children().ToList();

            IList<Property> processedList = new List<Property>();
            foreach (JToken item in results)
            {
                Property propertyItem = JsonConvert.DeserializeObject<Property>(item.ToString());
                processedList.Add(propertyItem);
            }

我运行了那个片段,但它确实有效。您可以浏览我在github上生成的代码:

https://github.com/thiagoavelino/VisualStudio_C/blob/master/VisualStudio_C/StackOverFlow/ParsingJason/ParsingJson.cs