使用动态对象反序列化JSON

时间:2014-05-06 21:46:50

标签: c# json restsharp

我有一个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"
        } [...]
}

4 个答案:

答案 0 :(得分:17)

由于这个JSON不是C#友好的,我不得不做一些hackery来使它正常出来。但是,结果非常好。

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替换。

输出看起来像这样:

Deserialization Output

答案 1 :(得分:3)

你的json是不正确的,但如果你纠正它,你可以使用像http://json2csharp.com/上的json-to-csharp工具来生成你的类:

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; }
}

答案 2 :(得分:0)

我对RestSharp一无所知,但如果您在服务器端使用Newtonsoft,那么您只需将 JObject 传递给您的方法即可。然后你可以询问对象,看看它到底是什么类型的对象,并使用JObject.ToObject()来转换它。

答案 3 :(得分:0)

我认为使用output是最简单的方法。

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; }
        }
    }