将JsonObjects反序列化为.NET对象

本文关键字:NET 对象 反序列化 JsonObjects | 更新日期: 2023-09-27 18:24:01

尝试使用JSON.NET将以下JSON反序列化为.NET对象并没有达到预期效果。反序列化通常不是一个主要的复杂问题,但下面的JSON的结构并不是那么简单。

JSON:

{
    "33": {
        "0": {
            "StopName": "JFK Blvd & 15th St",
            "Route": "33",
            "date": "11:24p",
            "day": "Fri",
            "Direction": "1",
            "DateCalender": "02/10/12 11:24 pm"
        },
        "3": {
            "StopName": "JFK Blvd & 15th St",
            "Route": "33",
            "date": "11:52p",
            "day": "Fri",
            "Direction": "1",
            "DateCalender": "02/10/12 11:52 pm"
        }
    },
    "32": {
        "1": {
            "StopName": "JFK Blvd & 15th St",
            "Route": "32",
            "date": "11:30p",
            "day": "Fri",
            "Direction": "1",
            "DateCalender": "02/10/12 11:30 pm"
        }
    },
    "17": {
        "2": {
            "StopName": "JFK Blvd & 15th St",
            "Route": "17",
            "date": "11:38p",
            "day": "Fri",
            "Direction": "1",
            "DateCalender": "02/10/12 11:38 pm"
        }
    }
}

并发症由代表路线编号的"33"、"32"answers"17"引起。这些数字可以随着结果集中路线的更改而更改。

我确信我需要为此编写一个自定义的JSON转换器,但我找不到任何关于完成此任务的明确信息(因为似乎没有人会遇到属性名称是动态的问题)。

我还尝试将JSON.NET Linq用于JSON,但这是不可行的,因为您需要使用类似于以下的代码来访问JSON:

JObject o = JObject.Parse(e.Result);
o["33"];

由于我之前不知道属性名称是什么,所以我似乎无法轻松遍历这个对象。

将JsonObjects反序列化为.NET对象

您的json格式:

{
    "33": { <-- This is MainRoute number
        "0": { <-- This is SubRoute number and below are SubRoute properties
            "StopName": "JFK Blvd & 15th St",
            "Route": "33",                        
            "date": "11:24p",                   
            "day": "Fri",
            "Direction": "1",
            "DateCalender": "02/10/12 11:24 pm"
        },
     ....
}

您可以使用JObject来解析json数据:

public class MainRoute {
        public int RouteNumber { get; set; }
        public IList<SubRoute> SubRoutes { get; set; }
        public MainRoute()
        {
                SubRoutes = new List<SubRoute>();
        }
}
public class SubRoute {
        public int RouteNumber { get; set; }
        public string StopName { get; set; }
        public int Route { get; set; }
        [JsonProperty("date")]
        public string Date { get; set; }
        [JsonProperty("day")]
        public string Day { get; set; }
        public int Direction { get; set; }
        [JsonProperty("DateCalender")]
        public string DateCalendar { get; set; }
}
class Program {
        static void Main(string[] args)
        {
                string jsonString = FetchJsonData();
                var routes = ParseRouteJsonString(jsonString);
        }
        static IEnumerable<MainRoute> ParseRouteJsonString(string jsonString)
        {
                JObject jsonObject = JObject.Parse(jsonString);
                foreach (KeyValuePair<string, JToken> pair in jsonObject) {
                        var mainRoute = new MainRoute() {
                                RouteNumber = Int32.Parse(pair.Key) // Get main route number.
                        };
                        foreach (JProperty property in pair.Value) {
                                var subRoute = property.Value.ToObject<SubRoute>();
                                subRoute.RouteNumber = Int32.Parse(property.Name); // Get sub route number.
                                mainRoute.SubRoutes.Add(subRoute);
                        }
                        yield return mainRoute;
                }
        }
}

以下是如何使用linq到json:迭代路由的小示例

var main = JObject.Parse(json);
foreach (var mainRoute in main.Properties())
{
    Console.WriteLine(mainRoute.Name); //33, 32, ... 
    foreach (var subRoute in mainRoute.Values<JObject>().SelectMany(x => x.Properties()))
    {
        Console.WriteLine(" " + subRoute.Name); //0, 3, ... 
        var routeData = subRoute.Value as JObject;
        foreach (var dataItem in routeData.Properties())
        {
            Console.WriteLine(string.Format("  {0} = {1}", dataItem.Name, dataItem.Value.Value<string>()));
        }
    }
}