使用动态对象反序列化JSON

11

我有一个JSON对象,其中包含一长串区号。不幸的是,每个区号都是Data对象列表中的对象名称。我该如何创建一个类,使RestSharp可以反序列化内容?

以下是我的类的样子:

public class phaxioResponse
{
    public string success { get; set; }
    public string message { get; set; }
    public List<areaCode> data { get; set; }

    public class areaCode
    {
        public string city { get; set; }
        public string state { get; set; }
    }
}

这里是JSON内容:

{
    success: true
    message: "277 area codes available."
    data: {
        201: {
            city: "Bayonne, Jersey City, Union City"
            state: "New Jersey"
        }
        202: {
            city: "Washington"
        state: "District Of Columbia"
        } [...]
}

2
那个 JSON 数据完全乱了。 - Pete Garafano
你真的希望有人会读完那么多吗? - John Saunders
1
@JohnSaunders 你不需要完整地读取 JSON 对象 - 我相信你可以看到主对象中只有三个节点,而数据对象始终是相同的。 - Peter Schrøder
1
如果我们不需要阅读它,那为什么要发布它呢? - John Saunders
2
我不明白为什么会有人嘲笑提问者,人们会把基本上任何垃圾数据都称作json,并期望你处理它。我曾经看到过“json”数据,它是一个列表的列表,其中第一个列表是列名,其余是值的列表... - Toadfish
显示剩余2条评论
4个回答

18

由于这个JSON格式不太适用于C#,我不得不进行了一些小技巧来使其正常输出。不过结果还是很好的。

var json = JsonConvert.DeserializeObject<dynamic>(sampleJson);
var data = ((JObject)json.data).Children();
var stuff = data.Select(x => new { AreaCode = x.Path.Split('.')[1], City = x.First()["city"], State = x.Last()["state"] });

这段代码将生成一个最能代表数据的匿名类型。然而,匿名类型可以很容易地被一个更普通的 DTO 类的 ctor 替换。

输出结果看起来像下面这样:

反序列化输出


你能解释一下在 json.data 中的 data 是什么吗?谢谢。 - Happy Bird
@HappyBird,这来自于问题中发布的JSON示例。 - Pete Garafano

2

您的JSON格式不正确,但如果您将其纠正,可以使用类似http://json2csharp.com/上的JSON转C#工具来生成您的类:

public class __invalid_type__201
{
    public string city { get; set; }
    public string state { get; set; }
}

public class Data
{
    public __invalid_type__201 __invalid_name__201 { get; set; }
}

public class RootObject
{
    public bool success { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}

1
这是一个很好的想法...不幸的是,JSON 不在我的手中 - 它来自外部 API。 - Peter Schrøder
1
@PeteFox 这不是有效的 JSON。所有字段名称都应该用引号括起来才能被视为有效的 JSON。这就是为什么 json2csharp.com 会生成无效的类。 - Pete Garafano

1
我不知道RestSharp的任何信息,但如果您在服务器端使用Newtonsoft,那么您可以将JObject传递给您的方法。然后,您可以查询该对象以查看它实际上是什么类型的对象,并使用JObject.ToObject()进行转换。

0

我认为使用 Dictionary<int,areaCode> 是最简单的方法。

public class phaxioResponse
    {
        public string success { get; set; }
        public string message { get; set; }
        public Dictionary<int,areaCode> data { get; set; }

        public class areaCode
        {
            public string city { get; set; }
            public string state { get; set; }
        }
    }

然后:

    var res= JsonConvert.DeserializeObject<phaxioResponse>(json);
    Console.WriteLine(string.Join(",", res.data));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接