反序列化真实世界的JSON数据

use*_*221 2 c# json json.net

遗憾的是,我不得不处理大量的JSON数据,因此不可避免地默认为json.net,其中我发现'文档'只涉及极其简单的例子.

作为示例,我的数据包含以下"实例".

"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" : ""
    }
]
Run Code Online (Sandbox Code Playgroud)

现在记住这个字符串的任何一边/无论json术语是什么,都是大量的其他数据.

有三个问题.

  1. 我按照文档,实际上无法让它吐出任何类型的值(我试图获取id字段).

  2. '属性'中有连字符,c#不允许变量/属性名中的连字符,那么你如何处理?

  3. 在上面的例子中,每个'属性'有两个,所以可能后者会覆盖对象中的前者,我是否需要一个对象列表然后以某种方式找出一种顺序插入每个值的方法?

我觉得整件事情不必要地变得复杂,因此迫切需要帮助 - 这是很多问题,但如果有人能告诉我如何获得"团队昵称"价值,我会非常感激.

提前致谢.

Tim*_* S. 8

对于名称问题,您应该使用它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"
Run Code Online (Sandbox Code Playgroud)

我曾经JsonPropertyTeam(不仅仅是连字符)中指定了所有属性名称,因此我可以使用C#/.Net标准属性大小写,同时仍然正确地序列化和反序列化.


Ada*_*lin 5

为您的团队对象创建一个类:

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;}
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过执行以下操作来反序列化您的JSON:

var listOfTeams = JsonConvert.DeserializeObject<List<Team>(inputString);
Run Code Online (Sandbox Code Playgroud)