0

我正在尝试在适用于 Windows 8 的 Visual Studio 2012 中用 C# 编写 Windows 运行时组件。使用 Json.NET 反序列化 JSON 时遇到一些问题,如下所示:

{
"header": {
    "id": 0,
    "code": 0,
    "hits": 10
},
"body": {
    "datalist": [
        {
            "name": "",
            "city": "",
            "age": 0
        },
        {
            "name": "",
            "city": "",
            "age": 0
        },
        {
            "name": "",
            "city": "",
            "age": 0
        }
    ]
}
}

我的意图是从中获得一个顶级字典,并将每个值解释为一个字符串。对于此示例,您将获得一个包含两个键(标题和正文)和匹配值作为字符串的字典。在此之后,您可以下树。像这样的功能

Dictionary<string, string> jsonDict =
            JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

会很好,但这个只接受字符串值。有人知道如何忽略类型或以另一种方式获取它吗?

此外,要从 body-value "{"datalist": [ { "name": "", ....}]}" 中取出一个字典列表。

提前致谢!

4

2 回答 2

0

如果您在定义类时遇到问题,VS 2012 中的一个不错的功能允许您Paste Special使用Edit. 例如,您的 JSON 创建了此类:

public class Rootobject
{
    public Header header { get; set; }
    public Body body { get; set; }
}

public class Header
{
    public int id { get; set; }
    public int code { get; set; }
    public int hits { get; set; }
}

public class Body
{
    public Datalist[] datalist { get; set; }
}

public class Datalist
{
    public string name { get; set; }
    public string city { get; set; }
    public int age { get; set; }
}

...然后您可以将您的请求反序列化为 的类型RootObject,例如

var obj = JsonConvert.DeserializeObject<RootObject>(json);
于 2013-05-31T14:55:04.870 回答
0

我会使用这个网站并反序列化为

var myObj =JsonConvert.DeserializeObject<RootObject>(json);

public class Header
{
    public int id { get; set; }
    public int code { get; set; }
    public int hits { get; set; }
}

public class Datalist
{
    public string name { get; set; }
    public string city { get; set; }
    public int age { get; set; }
}

public class Body
{
    public List<Datalist> datalist { get; set; }
}

public class RootObject
{
    public Header header { get; set; }
    public Body body { get; set; }
}

您也可以使用dynamic关键字而不声明任何类

dynamic myObj =JsonConvert.DeserializeObject(json);

var age = myObj.body.datalist[1].age;

而且由于 JObject 实现了 IDictionary<> 这也是可能的

var jsonDict = JObject.Parse(json);  
var age = jsonDict["body"]["datalist"][1]["age"];
于 2013-05-31T14:55:25.310 回答