不幸的是,我被迫处理大量JSON数据,因此不可避免地默认使用JSON.net,在那里我发现"documentation"只处理非常简单的示例。
例如,我的数据包含以下"实例"。
"team" : [{
"id" : "8",
"vendor-id" : "8",
"statsinc-id" : "8",
"team-name" : "",
"team-nickname" : "Pistons",
"rank" : ""
}, {
"id" : "51",
"vendor-id" : "29",
"statsinc-id" : "29",
"team-name" : "",
"team-nickname" : "Grizzlies",
"rank" : ""
}
]
现在请记住,这个字符串的任一侧/无论json术语是什么,都是大量的其他数据。
有三个问题。
我遵循了文档,但实际上无法让它吐出任何类型的值(我试图获取id字段)。
"attributes"中有连字符,c#不允许在变量/属性名称中使用连字符,那么如何处理呢?
在上面的例子中,每个"attribute"都有两个,所以假设后者会在对象中覆盖前者,我是否需要一个对象列表,然后以某种方式找到按顺序插入每个值的方法?
我发现整件事不必要地复杂,因此急需帮助——这是一个很大的问题,但如果有人能向我展示如何实现"团队昵称"的价值观,我将不胜感激。
提前谢谢。
对于名称问题,您应该使用JsonPropertyAttribute
来指定属性名称(当它们无法推断,或者您希望它不同时)。
有多个项目,但它们在一个数组中,因此您可以同时访问这两个项目。它们不会互相覆盖。
您可以使用JSONLint验证JSON,并使用json2csharp尝试基于JSON生成C#类。
您的JSON不是有效的完整JSON。我将它封装在{}
中,使其成为一个对象,然后能够创建以下类:
public class RootObject
{
public List<Team> team { get; set; }
}
public class Team
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("vendor-id")]
public string VendorId { get; set; }
[JsonProperty("statsinc-id")]
public string StatsIncId { get; set; }
[JsonProperty("team-name")]
public string TeamName { get; set; }
[JsonProperty("team-nickname")]
public string TeamNickname { get; set; }
[JsonProperty("rank")]
public string Rank { get; set; }
}
// this works!
var obj = JsonConvert.DeserializeObject<RootObject>(data);
var nicknames = obj.team.Select(x => x.TeamNickname); // "Pistons", "Grizzlies"
我使用JsonProperty
来指定Team
中的所有属性名称(而不仅仅是连字符的名称),这样我就可以使用C#/。净标准属性资本化,同时仍然正确序列化和反序列化。
为团队对象创建一个类:
public class Team {
[JsonProperty(PropertyName = "id")]
public int ID {get;set;}
[JsonProperty(PropertyName = "vendor-id")]
public int VendorID {get;set;}
[JsonProperty(PropertyName = "statsinc-id")]
public int StatsIncID {get;set;}
[JsonProperty(PropertyName = "team-name")]
public string TeamName {get;set;}
[JsonProperty(PropertyName = "team-nickname")]
public string TeamNickname {get;set;}
[JsonProperty(PropertyName = "rank")]
public Rank {get;set;}
}
然后,您可以通过执行以下操作来反序列化JSON:
var listOfTeams = JsonConvert.DeserializeObject<List<Team>(inputString);
关于2。当您创建要反序列化的类时,您会将属性标记为:
[JsonProperty(PropertyName = "team-name")]
public string teamName { get; set; }
[JsonProperty(PropertyName = "team-nickname")]
public string teamNickname { get; set; }
正如另一个答案所说,这是一个团队数组,因此他们将反序列化为"团队"对象的不同实例。