我需要将复杂的 JSON blob 反序列化为标准 .NET 容器,以便在不了解 JSON 的代码中使用。它期望事物采用标准的 .NET 类型,特别是 Dictionary<string, object>
或 List<object>
其中“对象”可以是原始的或递归的(字典或列表)。
我不能使用静态类型来映射结果并且 JObject/JToken 不适合。理想情况下,应该有某种方法(也许是通过契约(Contract)?)将原始 JSON 转换为基本的 .NET 容器。
我一直在寻找任何方法来诱使 JSON.NET 反序列化器在遇到“{}”或“[]”时创建这些简单类型,但收效甚微。
任何帮助表示赞赏!
最佳答案
如果您只想要一个可以处理任意 JSON 并将其转换为常规 .NET 类型(基元、列表和字典)的嵌套结构的通用方法,您可以使用 JSON.Net 的 LINQ-to-JSON API这样做:
using System.Linq;
using Newtonsoft.Json.Linq;
public static class JsonHelper
{
public static object Deserialize(string json)
{
return ToObject(JToken.Parse(json));
}
public static object ToObject(JToken token)
{
switch (token.Type)
{
case JTokenType.Object:
return token.Children<JProperty>()
.ToDictionary(prop => prop.Name,
prop => ToObject(prop.Value));
case JTokenType.Array:
return token.Select(ToObject).ToList();
default:
return ((JValue)token).Value;
}
}
}
您可以调用如下所示的方法。 obj
将包含 Dictionary<string, object>
, List<object>
,或原始的,具体取决于您开始使用的 JSON。
object obj = JsonHelper.Deserialize(jsonString);
关于.net - 如何使用 JSON.NET 反序列化为嵌套/递归字典和列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5546142/