我从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名称中使用_的更复杂的属性却没有。我错过了什么?
答案 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/