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

时间:2014-01-06 16:39:22

标签: 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" : ""
    }
]

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

有三个问题。

  1. 我按照文档进行操作,实际上无法将其吐出任何类型的值(我试图获取id字段)。

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

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

  4. 我发现整件事情不必要地变得复杂,因此迫切需要帮助 - 这要求很多,但如果有人能告诉我如何获得“团队昵称”的价值,我会非常感激。< / p>

    提前致谢。

3 个答案:

答案 0 :(得分: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"

我使用JsonProperty来指定Team中的所有属性名称(不仅仅是带连字符的属性),这样我就可以使用C#/。Net标准属性大小写,同时仍然正确地序列化和反序列化

答案 1 :(得分: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;}
}

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

var listOfTeams = JsonConvert.DeserializeObject<List<Team>(inputString);

答案 2 :(得分:3)

关于2.当你创建你的课程时,你要反序列化你会将你的属性标记为:

[JsonProperty(PropertyName = "team-name")]
public string teamName { get; set; }

[JsonProperty(PropertyName = "team-nickname")]
public string teamNickname { get; set; }

正如另一个答案所说,这是一系列团队,因此他们会反序列化到“团队”对象的不同实例。