Dot-Net

如何使用 JSON.NET 反序列化為嵌套/遞歸字典和列表?

  • April 5, 2011

我需要將復雜的 JSON blob 反序列化為標準 .NET 容器,以便在不知道 JSON 的程式碼中使用。它期望事物採用標準的 .NET 類型,特別是“對象”可以是原始的或遞歸的(字典或列表)Dictionary<string, object>List<object>

我不能使用靜態類型來映射結果並且 JObject/JToken 不適合。理想情況下,會有某種方法(也許通過合同?)將原始 JSON 轉換為基本的 .NET 容器。

我一直在尋找任何方法來誘使 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);

引用自:https://stackoverflow.com/questions/5546142