将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"];
由于我之前不知道属性名称是什么,所以我似乎无法轻松遍历这个对象。
您的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>()));
}
}
}