针对匿名对象的 System.Text.Json 序列化

2024-01-02

我正在开发一个 ASP .Net Core 3.1 应用程序,使用 2.2 从另一个应用程序移植部分代码。到目前为止,我想从 NewtonSoft JSON 序列化库切换到新的 System.Text.Json,但遇到了一些麻烦。

考虑一个使用以下返回类型提供 HTTP-GET 服务的函数:

    [HttpGet("myservice")]
    public async Task<ActionResult<object>> GetDataAsync( ...

那么,最终的部分可以描述如下:

        var items = new List<IMyInterface>();
        int totalCount = ...
        int min = ...
        int max = ...

        return new ActionResult<object>(new
        {
            totalCount,
            min,
            max,
            items
        });

但是,它不起作用:项目集合按其声明的类型(IMyInterface)而不是实际类型进行序列化。我读here https://stackoverflow.com/questions/58429098/jsonserializer-behaves-not-as-expected-when-the-specifc-class-is-casted-to-somet这是一种预期的行为,尽管对我来说并不那么直观。

我的问题是:是否有任何方便而可靠的方法来利用新的序列化器,甚至处理匿名对象?我会避免每次可以内联组成结果时创建一个特定的对象。

UPDATE:

这样做似乎可行,但看起来真的很难看:

        return new ActionResult<object>(new
        {
            totalCount,
            min,
            max,
            items = items.Cast<object>()
        });

点网小提琴 https://dotnetfiddle.net/3fBPQQ

如果你想序列化对象,为什么不将它们初始化为对象呢?是否需要将其创建为强类型?

    public static void Test()
    {
        var items = new List<object>() { new Class1 { Foo = "foo1", Bar1 = "Bar1" }, new Class2 { Foo = "foo1", Bar2 = "Bar2" } };
        int totalCount = 1;
        int min = 2;
        int max = 3;


        var root = new
        {
            totalCount,
            min,
            max,
            items,
        };

        var json = JsonSerializer.Serialize<object>(root, new JsonSerializerOptions { WriteIndented = true, });

        Console.WriteLine(json);
    }

如果您将项目创建为List<object>,您不必改变或做任何事情。这可能是一种更干净的方法,而不是在创建对象时将它们每个都强制转换为对象。

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

针对匿名对象的 System.Text.Json 序列化 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 不同机器上 dBase III .dbf 文件的编码问题

    我正在使用 C 和 NET 3 5 尝试使用 ODBC 和 Microsoft dBase 驱动程序从旧 dbf 文件导入一些数据 dbf 采用 dBase III 格式 并使用 ibm850 字符串编码 现在 当我在我的机器上运行我的程序
  • 一个进程中存在多个 Ruby EventMachines:可能吗?

    我有一种情况 我想在 Ruby 中运行多个 EventMachine 有人有这方面的经验吗 如果没有的话 我可以自己写一个测试用例来完成 请继续关注 让我们明确一点 我想自己实例化两个线程 然后调用EventMachine run在两个线程
  • 为什么我的 jar 文件不能在 netbeans 之外运行?

    我构建了一个 jar 文件 当我单击 运行 时 该文件可以在 netbeans 中完美运行 但是当我尝试通过双击运行 jar 文件时 它没有运行 什么也没有发生 双击 jar 即可启动它 但除非您有一个可以打开新窗口 在不同线程中 的 GU
  • 从 jsr-303 自定义验证器访问数据库

    我将基于 Spring 的验证与 Hibernate 验证器结合使用 该验证器由我的应用程序上下文中的以下内容启用
  • PyInstaller - ImportError:没有名为 _bootlocale 的模块

    每次我尝试在 PyInstaller 中编译 python 文件时 它都会返回很多错误 这些是编译错误 Traceback most recent call last File c users Person appdata local pr
  • 为什么python中会出现这个AttributeError?

    有件事我不明白 为什么会这样 import scipy happens with several other modules too I took scipy as an example now matrix scipy sparse co
  • Google 我的商家 API 的测试/沙盒环境

    我刚刚开始使用 Google My Business API 并且能够执行获取操作只是为了验证我的 Oauth 设置是否正确 现在 我想使用 GMB 添加位置 API 的 post 方法添加位置 但在将代码推送到生产环境之前 我想测试此请求
  • 从给定的链表在 C++ 中创建反向链表

    我在从给定的链接列表以相反的顺序创建链接列表时遇到一些问题 我有java背景 刚刚开始做一些C 你能检查一下我的代码并看看有什么问题吗 我猜我只是在操纵指针而不是创建任何新内容 this is a method of linkedlist
  • 如何在 C# 中解析/反序列化从 Rest 服务返回的 JSON

    我从结构如下的 URL 获取字符串格式的 JSON 但无法解析它 它抛出异常 知道如何解析它吗 结构如下 pathway patients patient patientid 7703176 name Abbot Bud status In
  • Magento 自定义管理模块为空

    我创建了一个自定义管理模块 但我无法在其中添加内容 它始终是空白的 我正在尝试使用简单的代码进行测试 但似乎没有任何效果 public function indexAction this gt loadLayout this gt addC
  • 即使关闭页面后脚本还会继续运行吗?

    如果我通过 jquery ajax 调用一个 php 文件 其中包含一个脚本来执行一些需要一段时间的操作 例如上传一个大视频 然后我关闭页面 php 脚本是否继续加载视频 看这里 http php net manual en functio
  • 在 Turtle - Python 3.4 中不设置动画?

    下面的代码创建一棵分形树 我想尽可能快地绘制它 我不希望发生任何动画 否则绘制需要很长时间 在Python的早期版本中 这是通过turtle speed 0 实现的 如下所示 这在 python 3 4 中不起作用 import turtl
  • 如果元素的 proptype 是默认值?

    如果我尝试将 proptype 设置为PropTypes element 不是必需的 正确的默认值是什么 static propTypes expandable PropTypes bool popover PropTypes elemen
  • 许多等待异步方法,还是单个等待包装 Task.Run?

    假设我们必须通过异步流程在数据库中写入包含 1000 个元素的列表 是等待 1000 次异步插入语句更好 还是将所有 1000 次插入包装在封装到一个同步方法中 Task Run声明 等待一次 例如 SqlCommand每种方法都与他的方法
  • 空引用检查的良好做法是什么? [复制]

    这个问题在这里已经有答案了 检查对象上的空引用的最有效方法是什么 我见过各种代码示例 它们具有不同的检查方式 因此以下哪一种是最有效的 或者哪一种被认为是最佳实践 Object ReferenceEquals item null item
  • 无法使用 StringLiteralConvertible 类型的参数列表调用“init”

    当我尝试运行下面的代码时 出现此错误 Cannot invoke init with argument list of type id StringLiteralConvertible host Contact target Contact
  • 我如何从 C++ 的子 c-tor 中初始化超类参数?

    观看以下示例 class A public A int param1 int param2 int param3 class B public A public B m param1 1 m param 2 m param 3 A m pa
  • Rails 5.1,图表显示多种货币的总和

    我遇到了一个关于图表踢的小问题 我有一个铁路应用程序 您可以在其中创建不同的货币 然后 您可以创建包含标题 金额的费用 并从列表和 user id 中选择货币 这种关系已经建立并且正在发挥作用 我的用户控制器中有这样的东西 user spe
  • 具有多个参数的 JPA Criteria API

    我需要创建一个使用带有多个参数的 JPA Criteria API 的搜索方法 现在的问题是并不是每个参数都是必需的 因此有些可能为空 并且它们不应包含在查询中 我已经用 CriteriaBuilder 尝试过此操作 但我不知道如何使其工作
  • 针对匿名对象的 System.Text.Json 序列化

    我正在开发一个 ASP Net Core 3 1 应用程序 使用 2 2 从另一个应用程序移植部分代码 到目前为止 我想从 NewtonSoft JSON 序列化库切换到新的 System Text Json 但遇到了一些麻烦 考虑一个使用