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名称中包含_的更复杂的属性不能正确转换。我错过了什么?
你可以试试这个。您可以使用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/