问题标签 [system.text.json]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
8255 浏览

c# - 如何使用 System.Text.Json 解析带有注释的 JSON?

我有一些包含注释的 JSON(即使JSON 规范中不严格允许注释。)如何使用 解析这个 JSON System.Text.Json

我收到的 JSON 如下:

当我尝试将它加载到JsonDocument这样的:

我得到以下异常:

当我尝试反序列化时JsonSerializer

我得到一个类似的例外:

如何使用 解析或反序列化此 JSON System.Text.Json

0 投票
1 回答
176 浏览

c# - 扩展字典的属性不会在序列化中显示

我扩展了一个字典(这是翻译的完美数据结构)并添加了一个标记,告诉我们将执行哪种翻译。

但是,当我序列化对象时,我只能在输出字符串中获得键值对。名字不显示。我想使用微软叔叔的礼包中的东西,即System.Text.Json,所以我做了以下事情。

我的怀疑是我需要实现一个自定义序列化程序,但这对于这个简单的案例来说太麻烦了。我的经验告诉我,工具中捆绑了一种简洁、流畅的方法(我根本不知道)。

怎么做?或者,如果不可能顺利,为什么这是一个复杂的问题(我显然没有意识到)?

我期待下面表格上的 JSON。

当然,我可以通过在我的字典中添加一个项目来解决它,其中namevaluedonkey。但是那个务实的解决方案,我更喜欢保存作为我的后备。目前我有一些额外的时间,想玩弄这个结构。此外,我可以想象名称可能会变成一个int而不是字符串,或者甚至可能是一个更复杂的结构来描述,例如时间戳或其他东西。那将完全违反字典的合同(字符串到字符串的映射)。

0 投票
1 回答
435 浏览

asp.net-core-3.0 - .NET Core 3.1 - Ajax OnGet 并使用新的 System.Text.Json 返回对象

今天,当我尝试从包含外键字段的 LINQ 查询返回对象数组时,我第一次偶然发现了这个问题。Microsoft 离开 Newtonsoft JSON Library for .NET Core 3+ 的举动让我不知道如何执行下面显示的等效方法:

下面的示例曾经在 Core 2.2 中工作,但现在抛出错误“System.Text.Json.JsonException:检测到不支持的可能对象循环。这可能是由于循环或对象深度大于最大允许深度 32 造成的。

下面的 Ajax 调用:

我尝试使用属性“[JsonIgnore]”标记模型类中的外键字段,因为我实际上不需要从其他表中读取嵌套属性,我只需要 ApplicationUserId 字符串值本身。我使用关系表的唯一原因是级联删除。

我找不到任何解释如何使用较新系统的代码示例?

0 投票
2 回答
6989 浏览

c# - TimeSpan的系统文本JsonSerializer反序列化

在研究如何TimeSpan使用 Newtonsoft 的 JSON.net 反序列化时,我在当前项目中遇到了不使用 Json.net 的代码。根据我正在运行的单元测试,它在反序列化属性的操作上使用System.Text.Json.JsonSerializer并且似乎没有失败。TimeSpan

太好了,我想,.Net Core 3.1已经超越了反序列化 a 的历史问题,TimeSpan一切都很好。因此,在最新版本的 Linqpad 6(使用 .NET Core)中启动了一个测试用例来验证,令我懊恼的是它失败了。


所以问题是,是否可以TimeSpan使用任何一个库进行序列化/反序列化(如果可以的话)......或者我的测试用例在某些方面是否存在缺陷?


代码

Linqpad C# 代码

反序列化失败

在此处输入图像描述

0 投票
0 回答
2348 浏览

asp.net-core - Swashbuckle.AspNetCore.Filters 在尝试使用 System.Text.Json.Serialization.JsonStringEnumConverter 时抛出异常

我有一个 ASP.NET Core 3.1 项目,我想在该项目上生成 API 文档以及使用 Swagger 的可查询示例。

我想使用新的System.Text.Json命名空间而不是旧Newtonsoft.Json的命名空间

Swagger 文档中所述

如果您使用 System.Text.Json (STJ),那么上述设置就足够了,Swagger 生成器将自动支持 STJ 选项/属性

如果您使用的是 Newtonsoft,那么您需要安装一个单独的包并明确选择加入,以确保 Swagger 生成器自动支持 Newtonsoft 设置/属性

我没有安装软件包Swashbuckle.AspNetCore.Newtonsoft,也没有调用services.AddSwaggerGenNewtonsoftSupport().

我的控制器的方法看起来像这样(我想将 Enums 转换为字符串值而不是整数)

但是,当我执行此方法时(在我的 中调用Startup.cs

我得到一个例外说

System.InvalidCastException

H结果=0x80004002

消息=无法将“System.Text.Json.Serialization.JsonStringEnumConverter”类型的对象转换为“Newtonsoft.Json.JsonConverter”类型。来源=Swashbuckle.AspNetCore.Filters

这是我在我的.csproj

如果我改变我的控制器的方法来使用Newtonsoft.Json它工作得很好,也不例外

我什至试图在我的Startup.cs

但我仍然无法使用System.Text.Json.Serialization.JsonStringEnumConverter,只能使用Newtonsoft.Json.Converters.StringEnumConverter

这是我的FooQuery类,其中包含一个FooEnum我想在 Swagger 中转换为字符串值的属性

那么我的代码在某处不正确吗?我错过了什么?

还是Swashbuckle.AspNetCore.Filters包裹有问题?这个包的版本是否有5.0.0-rc9问题并且还不兼容System.Text.Json.Serialization.JsonStringEnumConverter

感谢您的回答

0 投票
4 回答
8748 浏览

c# - System.Text.Json 反序列化来自 API 调用的嵌套对象 - 数据包装在父 JSON 属性中

我有一个 API JSON 响应,它将数据内容包装在一个data属性中,如下所示:

因此,当使用类似的库请求用户对象时,用户RequestSharpresponse.Content内容包含在datajson 属性中,因为它来自 API。代码:

这很好,但是当我将 json 反序列化为 Object 时System.Text.Json,如下所示,将创建该User对象但不会分配任何属性,尽管这是意料之中的,因为序列化程序正在寻找带有first_nameand的属性last_name。 .. 不是['data']['first_name']

我怎样才能JsonSerializer.Deserialize忽略data包装器?在其他 API 调用中,它可能是 Object 的名称,例如transactionor user,无论哪种方式,它都会包装数据。

其他注意事项:

我的目标是最新的 .Net Core 3.1,并且正在从 Newtonsoft Json.Net 迁移


我的用户对象:


解决后更新:

我从下面的 u/Nikunj Kakadiya 中选择了答案,作为可行的方法,并且与我最终做的最相似。

我创建了一个基于通用模板的容器类来处理data这样的问题:

然后我使用该容器类来包装从 API 调用返回的 json 内容,如下所示:

此外,正如 u/Pavel Anikhouski 所指出的,我对User类的序列化导致了一个错误,需要我为该id字段创建一个自定义转换器。APIid以整数形式返回,尽管它是User类中的字符串。这是我遇到的最初令人困惑的错误,但我很快就弄清楚了:ERROR: The JSON value could not be converted to System.String. Path: $.data.id | LineNumber: 0 | BytePositionInLine: 77.

这是自定义转换器IntToStringConverter

然后更改User类以使用客户转换器:

0 投票
1 回答
2551 浏览

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

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

考虑一个函数来提供具有此返回类型的 HTTP-GET 服务:

然后,最后一部分可以描述如下:

但是,它不起作用:items 集合由其声明的类型 (IMyInterface) 序列化,而不是实际类型。我在这里读到这是一种预期的行为,尽管对我来说不是那么直观。

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

更新:

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

0 投票
1 回答
1118 浏览

c# - 是否可以序列化 System.Text.Json 中列表成员的派生属性?

根据以下文件System.Text.Json

要序列化派生类型的属性,请使用以下方法之一:

  • (...)
  • 将要序列化的对象声明为object.

不幸的是,正如我刚刚发现的那样,这不允许序列化列表成员的派生属性。考虑以下 DTO 类:

它们应该用作List<GameUpdate>. 不幸的是,将要序列化的列表声明为object仍然无法序列化重要属性:

这会产生以下 JSON:

为了比较, usingNewtonsoft.Json.JsonConvert.SerializeObject(gameUpdates)产生以下结果:

是否可以使用 获得类似的结果System.Text.Json

为什么我要问这个:我一直在尝试开发基于浏览器的游戏作为一个爱好项目,而这正是我实现服务器与浏览器通信的方式。随着 Asp .NET Core 3 的出现,它的文档鼓励从 Newtonsoft.JSON 迁移到 System.Text.Json。在阅读了可以进行多态序列化的文档后,我删除了与 Newtonsoft 相关的代码并开始使用 System.Text.Json,却发现游戏不再工作。

0 投票
1 回答
285 浏览

c# - 如何序列化堆栈使用 System.Text.Json 到 JSON 而不反转堆栈?

如果我有一个Stack<T>for some T,并使用 new 将它往返到 JSON System.Text.Json.JsonSerializer,则在反序列化后堆栈中项目的顺序将被反转。如何使用此序列化程序将堆栈序列化和反序列化为 JSON,而不会发生这种情况?

详情如下。我有一个Stack<int>并将 3 个值推1, 2, 3到它上面。然后我使用 将其序列化为 JSON JsonSerializer,这导致

但是,当我将 JSON 反序列化为新堆栈时,堆栈中的整数会反转,并且稍后断言堆栈顺序等于失败:

如何防止序列化程序在序列化期间反转堆栈?

演示小提琴在这里

0 投票
2 回答
4674 浏览

c# - System.Text.Json 将字典序列化为数组

是否可以使用 System.Text.Json 将字典序列化(和反序列化)为数组?

而不是{ "hello": "world" }我需要将我的字典序列化为{ "key": "hello", "value": "world" }最好,而不必在我的类的字典属性上设置属性。

使用 newtonsoft.json 可以这样: