Json.Net正确解析财产名称

时间:2015-09-17 02:30:04

标签: c# json.net

我从API获得了一些类似于JSON的数据

{
    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之类的简单属性可以正确转换,但是在prop名称中使用_的更复杂的属性却没有。我错过了什么?

2 个答案:

答案 0 :(得分:3)

你可以试试这个。您可以使用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实例并获取适当的值。

答案 1 :(得分:1)

像这样使用JsonPropertyAttribute:

[JsonProperty("author_flair_text")]
public string AuthorFlairText { get; set; }

这确保它采用正确的名称,与代码中的属性不同。

编辑:您也可以将此工具用于更大的json文件,它会为您的数据生成类:http://json2csharp.com/