将 JObject 转换为集合

Ole*_* Sh 2 parsing json json.net

我有以下代码:

JToken hours = jToken["hours"];
Run Code Online (Sandbox Code Playgroud)

它返回以下 JSON:

{
    "monday": [
        ["11:00", "21:30"]
    ],
    "tuesday": [
        ["11:00", "21:30"]
    ],
    "wednesday": [
        ["11:00", "21:30"]
    ],
    "thursday": [
        ["11:00", "21:30"]
    ],
    "friday": [
        ["11:00", "2:00"]
    ],
    "saturday": [
        ["11:00", "2:00"]
    ],
    "sunday": [
        ["11:00", "21:30"]
    ]
}
Run Code Online (Sandbox Code Playgroud)

我需要将其解析为类型化集合,例如

<string, string> 
Run Code Online (Sandbox Code Playgroud)

或为任何一天选择一个值,例如

hours.Where(p=>p["monday"].Value<string>())
Run Code Online (Sandbox Code Playgroud)

我试过:

IList<JToken> a = hours.Children().ToList();

var a = JsonConvert.DeserializeObject<Pair<string, string>>(hours.Value<string>());

var a = hours["monday"];

hours.Where(p=>p["monday"].Value<string>())
Run Code Online (Sandbox Code Playgroud)

没有工作。

Ath*_*ari 5

至少可以说,这个 JSON 很奇怪。它包含列表列表中的小时数。可能的原因之一是一天可以包含多个小时列表。您应该将此问题指向您拥有的 JSON 的来源。

无论如何,正确的集合类型是这样的:

using HoursCollection = Dictionary<string, List<List<string>>>;
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法将字符串转换为该集合:

var a = JsonConvert.DeserializeObject<HoursCollection>(hours.ToString());
Run Code Online (Sandbox Code Playgroud)

但是,更好的主意是使用JObject您已有的:

var a = hours.ToObject<HoursCollection>();
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式从此集合中获取周一的小时数:

var h = a["monday"].SelectMany(i => i);
Run Code Online (Sandbox Code Playgroud)

SelectMany此处用于展平列表列表。