Json.正确解析属性名称

本文关键字:属性 Json | 更新日期: 2023-09-27 18:13:02

我得到一些数据,看起来像下面的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这样简单的属性可以正确转换,但在prop名称中包含_的更复杂的属性不能正确转换。我错过了什么?

Json.正确解析属性名称

你可以试试这个。您可以使用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/