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/

Другие вопросы по тегам