反序列化json对象/数组

时间:2014-12-01 08:02:21

标签: c# json.net

我有一个来自网络服务器的JSON响应,我正在尝试将其反序列化为我可以在我的C#代码中使用的东西。

{
"sprints": [
    {
        "id": 377,
        "sequence": 377,
        "name": "Sprint 1",
        "state": "CLOSED",
        "linkedPagesCount": 0
    },
    {
        "id": 354,
        "sequence": 354,
        "name": "Sprint 2",
        "state": "CLOSED",
        "linkedPagesCount": 0
    }
],
"velocityStatEntries": {
    "354": {
        "estimated": {
            "value": 19,
            "text": "19.0"
        },
        "completed": {
            "value": 15,
            "text": "15.0"
        }
    },
    "377": {
        "estimated": {
            "value": 21,
            "text": "21.0"
        },
        "completed": {
            "value": 19,
            "text": "19.0"
            }
        }
    }
}

以上似乎是一个数组(sprints)然后是一个对象(velocityStatEntries) - >对象(例如354) - >对象(估计)和对象(已完成)。

我尝试使用JsonConvert.DeserializeObject<DataSet>(t);进行反序列化,但我得到了一个例外:

其他信息:读取DataTable时出现意外的JSON令牌。预期的StartArray,得到了StartObject。路径'velocityStatEntries',第1行,第630位。

这是显而易见的,因为它不明白有一个数组然后还有别的东西。我可以以某种方式指定我所拥有的数据类型,而无需像类那样在代码中创建完整的结构吗?

/ donnib

2 个答案:

答案 0 :(得分:0)

最新的json.net版本允许您这样做:

dynamic d = JObject.Parse("{number:10, str:'string', array: [1,2,3]}");

Console.WriteLine(d.number);
Console.WriteLine(d.str);
Console.WriteLine(d.array.Count);

输出:

 10
 string
 3

此处的文档: LINQ to JSON with Json.NET

答案 1 :(得分:0)

你有很多方法:

您可以为JSON对象获取JSON数组和字典的列表。

List<Dictionary<string,List<Dictionary<string,object>>>>

您可以使用对象类显式定义数据结构:

public class Sprint {
    public int id;
    public int sequence;
    public string name;
    public string state;
    public int linkedPagesCount;
}

public class Sth {
    public Sprint[] sprints;
    ...
}

new JavaScriptSerializer().Deserialize<Sth>(mySthVariable)

您可以使用dynamic数据类型。

你可以把它们中的两个甚至三个混合成热腾腾的热汤。