Json.Net правильно разрешает имена свойств
Я получаю некоторые данные, которые выглядят как ниже JSON из API
{
body_html: "<h1>Test</h1>",
id: "cu1bpkz",
link_id: "d3_3kkgis",
author: "jdoe",
author_flair_text: null,
author_flair_css_class: null,
parent_id: "t3_3kkgis",
body: "Test",
subreddit_id: "q5_39vkz",
created_utc: 1442108087,
subreddit: "test"
}
И вот мой строго типизированный класс, который я использую для десериализации:
public class Comment
{
public string AuthorFlairText { get; set; }
public string AuthorFlairCssClass { get; set; }
public string Author { get; set; }
public string LinkId { get; set; }
public string Id { get; set; }
public string BodyHtml { get; set; }
public string Url { get; set; }
public string SubredditId { get; set; }
public string Subreddit { get; set; }
public long CreatedUtc { get; set; }
public string Body { get; set; }
public string ParentId { get; set; }
}
Это мой распознаватель для разрешения имен свойств:
public class ApiContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
var parts = propertyName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
return parts.Select(x => char.ToUpper(x[0]) + x.Substring(1)).Aggregate((curr, next) => curr + next);
}
}
Вот как я десериализую свой JSON, и он не работает.
var settings = new JsonSerializerSettings { ContractResolver = new ApiContractResolver() };
var obj = JsonConvert.DeserializeObject<Comment>(json, settings);
В то время как простые свойства, такие как body и id, преобразуются должным образом, более сложные свойства с _ в имени свойства не могут. Что мне не хватает?
2 ответа
Вы можете попробовать это. ты можешь использовать JsonPropertyAttribute
сообщить Json.Net, какое поле json соответствует этому свойству.
public class Comment
{
[JsonProperty("author_flair_text")]
public string AuthorFlairText { get; set; }
[JsonProperty("author_flair_css_class")]
public string AuthorFlairCssClass { get; set; }
[JsonProperty("author")]
public string Author { get; set; }
[JsonProperty("link_id")]
public string LinkId { get; set; }
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("body_html")]
public string BodyHtml { get; set; }
[JsonProperty("url")]
public string Url { get; set; }
[JsonProperty("subreddit_id")]
public string SubredditId { get; set; }
[JsonProperty("subreddit")]
public string Subreddit { get; set; }
[JsonProperty("created_utc")]
public long CreatedUtc { get; set; }
[JsonProperty("body")]
public string Body { get; set; }
[JsonProperty("parent_id")]
public string ParentId { get; set; }
}
Все остальное позаботилось, только URL - это свойство, которое я не могу найти в JSON. Пожалуйста, посмотрите, иначе код готов к копированию, вставке и запуску.
Вы можете хранить объект типа JsonModel
и в конструкторе вашей модели инициализировать его с помощью JsonConvert.DeserializeObject<T>
, Ваши публичные объекты могут просто JsonModel
экземпляр и получить соответствующие значения.
Используйте атрибут JsonPropertyAttribute следующим образом:
[JsonProperty("author_flair_text")]
public string AuthorFlairText { get; set; }
Это гарантирует, что оно примет правильное имя, отличное от свойства в коде.
Редактировать: Вы также можете использовать этот инструмент для больших файлов JSON, он генерирует классы для ваших данных: http://json2csharp.com/