2015-06-21 4 views
3

Я получаю JSon от стороннего API, который не соответствует моим классам.Пользовательское преобразование JSon для объектов C#

Некоторые свойств 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 
    } 
    ] 
} 

Как мне это сделать?

UPDATE 1

Используя Тьяго предложение, я смог разобрать и 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>>(); 

Любые идея, почему это происходит?

+0

было мое обновление полезным? –

ответ

1

Мигель, ты пробовал 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

UPDATE

Пытаться разобрать 'данные', используя фрагмент кода ниже:

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

+0

Я попробовал ваше предложение, но у меня все еще есть проблемы с разбором свойств. Затем я попробовал собственный конвертер, но не повезло. Я просто добавил обновление. Вы знаете, что может пойти не так? –

+0

Мигель, я пробую это здесь, я отправлю ответ в ближайшее время. –

Смежные вопросы