JSON.NET 反序列化对象/对象数组中的对象

2023-12-25

我遇到的情况是,我使用的 API 返回不一致的 JSON,我想使用 JSON.NET 对其进行反序列化。在一种情况下,它返回一个包含对象的对象(注意外面的“1”可以是任何数字):

{
   "1":{
      "0":{
         "db_id":"12835424",
         "title":"XXX"
      },
      "1":{
         "db_id":"12768978",
         "title":"YYY"
      },
      "2":{
         "db_id":"12768980",
         "title":"ZZZ"
      },
      "3":{
         "db_id":"12768981",
         "title":"PPP"
      }
   }
}

在另一种情况下,它返回一个对象数组:

{
   "3":[
      {
         "db_id":"12769199",
         "title":"XXX"
      },
      {
         "db_id":"12769200",
         "title":"YYY"
      },
      {
         "db_id":"12769202",
         "title":"ZZZ"
      },
      {
         "db_id":"12769243",
         "title":"PPP"
      }
   ]
}

我不知道为什么会存在这种不一致,但这是我正在使用的格式。使用以下命令反序列化两种格式的正确方法是什么JsonConvert.DeserializeObject method?


对于当前版本的 Json.NET (Json.NET 4.5 Release 11),这里是自定义创建转换器它将处理 Json,有时反序列化为对象,有时反序列化为数组。

public class ObjectToArrayConverter<T> : CustomCreationConverter<List<T>> where T : new() 
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        List<T> target = new List<T>();

        try
        {
            // Load JObject from stream
            JArray jArray = JArray.Load(reader);

            // Populate the object properties
            serializer.Populate(jArray.CreateReader(), target);
        }
        catch (JsonReaderException)
        {
            // Handle case when object is not an array...

            // Load JObject from stream
            JObject jObject = JObject.Load(reader);

            // Create target object based on JObject
            T t = new T();

            // Populate the object properties
            serializer.Populate(jObject.CreateReader(), t);

            target.Add(t);
        }

        return target;
    }

    public override List<T> Create(Type objectType)
    {
        return new List<T>();
    }
}

用法示例:

[JsonObject]
public class Project
{
    [JsonProperty]
    public string id { get; set; }

    // The Json for this property sometimes comes in as an array of task objects, 
    // and sometimes it is just a single task object.
    [JsonProperty]
    [JsonConverter(typeof(ObjectToArrayConverter<Task>))]
    public List<Task> tasks{ get; set; }
}

[JsonObject]
public class Task
{
    [JsonProperty]
    public string name { get; set; }

    [JsonProperty]
    public DateTime due { get; set; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON.NET 反序列化对象/对象数组中的对象 的相关文章

随机推荐

  • 尝试让 CUDA 7.5 与 GCC 5.x 一起工作

    因此 如果您在系统 GCC 版本为 5 及更高版本时尝试使用 nvcc 则会收到 版本不受支持 错误 但是 我听说人们报告说他们刚刚对此进行了评论 并且 CUDA 7 5 与 GCC 5 x 一起 为他们工作 然而 当我做同样的事情时 支票
  • 如何改变android中数组元素的颜色? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我只是想知道 我们可以更改特定数组索引的颜色吗 我有一个以下数组 String all 1 2 3 4 5 6 7 8 9 10 所以 我想
  • 使用大的静态变量是一个坏主意吗?

    我使用 ASP NET MVC 4 我想加载大量数据并使其在我的所有类中都可以访问 这是我的代码的简约示例 public class MyController Controller public static List
  • 数据库中的重复条目

    我有一个巨大的产品表 但有很多重复的条目 该表有超过 10000 个条目 我想删除其中的重复条目 而不需要手动查找并删除它 如果您能为我提供解决方案 请告诉我 你可以使用SELECT DISTINCT INTO TempTable 删除原始
  • 创建图像而不将其存储为本地文件

    这是我的情况 我想从用户上传的图像创建一个调整大小的 jpeg 图像 然后将其发送到 S3 进行存储 但我希望避免将调整大小的 jpeg 写入磁盘 然后为 S3 请求重新加载它 有没有办法完全在内存中完成此操作 并将图像数据 JPEG 格式
  • 将光标设置到 contenteditable div 的末尾

    如果当前标签为空 我试图将光标设置到下一个 上一个 contenteditable 标签的末尾 但是当我设置焦点时 它将焦点添加到文本的开头而不是结尾 尝试了几乎所有的解决方案 但似乎没有一个对我有用 这是我正在尝试的简单代码 HTML代码
  • 在android中查询“dumpsys meminfo”

    当我在 android 4 2 上运行 adb shell dumpsys meminfo 时 我得到的结果如下 Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free N
  • 如何使用 Selenium IDE 上传文件?

    这在过去是有效的 但最近我一直在尝试使用 Selenium IDE 上传文件 现在我收到此错误 错误 意外异常 代码 gt 1000 INDEX SIZE ERR gt 1 DOMSTRING SIZE ERR gt 2 HIERARCHY
  • 在 MVC 5 中使用 ModelClientValidationRule 抛出错误?

    我尝试在 MVC 5 项目中进行自定义客户端验证 当我添加以下代码时 public IEnumerable
  • 在一个txt文件中搜索多个字符串

    我确实知道对此还有多个其他答案 但它们不适合我的代码 因为我的代码每次搜索必须处理 1000 行以上 我想组合 2 个输入的字符串 以便 PHP 脚本在 txt 文件中搜索这两个字符串 并在输出时组合它们 这是我尝试过的 search GE
  • 为什么当我从网络浏览器打开它并在Java中读取它时,html源代码是不同的? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个关于解析在线 html 页面
  • CakePHP:提交失败时清除密码字段

    问候 我正在设置一个带有密码字段的非常标准的注册表单 问题是 提交失败后 由于字段为空 格式不正确等 控制器会重新加载注册页面 但密码字段包含先前输入的密码的哈希值 每次提交失败后如何将其清空 View echo form gt passw
  • 使用 selectize 从选定内容获取文本

    我试过这个 var eventHandler function return function console log select val var select selectize selectize create true onChan
  • 原则 2,本机查询

    我正在尝试使用 Doctrine 2 进行本机查询 但我无法使其工作 q SELECT FROM user recent activity WHERE id user gt id rsm new Doctrine ORM Query Res
  • 运行时错误“1004”无法获取 WorksheetFunction 类的 Match 属性

    nSectionSetupRow Application WorksheetFunction Match Worksheets Items Cells nRow 1 Worksheets SectionSetup Range B1 B Wo
  • 下一个/路由器和下一个/导航有什么区别?

    在 Next js 中 我都知道next router and next navigation have a useRouter hook 但是返回的对象不同 为什么 Next js 在两个路由包上有相同的钩子 The useRouter
  • 将 ifstream 转换为 bool 与使用 ifstream::is_open() 之间的区别

    也许是一个虚拟问题 但我需要一个明确的答案 这些函数的返回有什么区别吗 int FileExists const std string filename ifstream file filename c str return file in
  • Fortran FORMAT 语句中的语法错误

    I am using the gfortran compiler and I am unable to find the syntax error in the line Can anyone tell me the syntax erro
  • SQL排除查询

    是否可以在单个 SQL 语句中执行以下操作 例如 在提示中使用电话号码的子集8001231000 8001239999 然后查询我的数据库中有电话号码 并返回原始子集中哪些电话号码不在我的数据库中 我的数据库是Oracle 10g 基本上不
  • JSON.NET 反序列化对象/对象数组中的对象

    我遇到的情况是 我使用的 API 返回不一致的 JSON 我想使用 JSON NET 对其进行反序列化 在一种情况下 它返回一个包含对象的对象 注意外面的 1 可以是任何数字 1 0 db id 12835424 title XXX 1 d