gpt4 book ai didi

c# - 将 JsonObject 反序列化为 .NET 对象

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:12 24 4
gpt4 key购买 nike

尝试使用 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”、“17”产生的。这些数字会随着结果集中路由的变化而变化。

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

我也尝试过使用 JSON.NET Linq to 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;
}
}
}

关于c# - 将 JsonObject 反序列化为 .NET 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9238129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com