问题标签 [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.
c# - 如何使用 System.Text.Json 解析带有注释的 JSON?
我有一些包含注释的 JSON(即使JSON 规范中不严格允许注释。)如何使用 解析这个 JSON System.Text.Json
?
我收到的 JSON 如下:
当我尝试将它加载到JsonDocument
这样的:
我得到以下异常:
当我尝试反序列化时JsonSerializer
:
我得到一个类似的例外:
如何使用 解析或反序列化此 JSON System.Text.Json
?
c# - 扩展字典的属性不会在序列化中显示
我扩展了一个字典(这是翻译的完美数据结构)并添加了一个标记,告诉我们将执行哪种翻译。
但是,当我序列化对象时,我只能在输出字符串中获得键值对。名字不显示。我想使用微软叔叔的礼包中的东西,即System.Text.Json,所以我做了以下事情。
我的怀疑是我需要实现一个自定义序列化程序,但这对于这个简单的案例来说太麻烦了。我的经验告诉我,工具中捆绑了一种简洁、流畅的方法(我根本不知道)。
怎么做?或者,如果不可能顺利,为什么这是一个复杂的问题(我显然没有意识到)?
我期待下面表格上的 JSON。
当然,我可以通过在我的字典中添加一个项目来解决它,其中键是name和value是donkey。但是那个务实的解决方案,我更喜欢保存作为我的后备。目前我有一些额外的时间,想玩弄这个结构。此外,我可以想象名称可能会变成一个int而不是字符串,或者甚至可能是一个更复杂的结构来描述,例如时间戳或其他东西。那将完全违反字典的合同(字符串到字符串的映射)。
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 字符串值本身。我使用关系表的唯一原因是级联删除。
我找不到任何解释如何使用较新系统的代码示例?
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# 代码
反序列化失败
asp.net-core - Swashbuckle.AspNetCore.Filters 在尝试使用 System.Text.Json.Serialization.JsonStringEnumConverter 时抛出异常
我有一个 ASP.NET Core 3.1 项目,我想在该项目上生成 API 文档以及使用 Swagger 的可查询示例。
我想使用新的System.Text.Json
命名空间而不是旧Newtonsoft.Json
的命名空间
如果您使用 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
?
感谢您的回答
c# - System.Text.Json 反序列化来自 API 调用的嵌套对象 - 数据包装在父 JSON 属性中
我有一个 API JSON 响应,它将数据内容包装在一个data
属性中,如下所示:
因此,当使用类似的库请求用户对象时,用户RequestSharp
的response.Content
内容包含在data
json 属性中,因为它来自 API。代码:
这很好,但是当我将 json 反序列化为 Object 时System.Text.Json
,如下所示,将创建该User
对象但不会分配任何属性,尽管这是意料之中的,因为序列化程序正在寻找带有first_name
and的属性last_name
。 .. 不是['data']['first_name']
我怎样才能JsonSerializer.Deserialize
忽略data
包装器?在其他 API 调用中,它可能是 Object 的名称,例如transaction
or 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
类以使用客户转换器:
c# - 针对匿名对象的 System.Text.Json 序列化
我正在开发一个 ASP .Net Core 3.1 应用程序,使用 2.2 从另一个应用程序移植部分代码。到目前为止,我想从 NewtonSoft JSON 序列化库切换到新的 System.Text.Json,但我遇到了一些麻烦。
考虑一个函数来提供具有此返回类型的 HTTP-GET 服务:
然后,最后一部分可以描述如下:
但是,它不起作用:items 集合由其声明的类型 (IMyInterface) 序列化,而不是实际类型。我在这里读到这是一种预期的行为,尽管对我来说不是那么直观。
我的问题是:是否有任何方便而可靠的方法来利用新的序列化程序,甚至处理匿名对象?每次我可以内联组合结果时,我都会避免创建一个特定的对象。
更新:
这样做似乎可行,但看起来真的很难看:
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,却发现游戏不再工作。
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 反序列化为新堆栈时,堆栈中的整数会反转,并且稍后断言堆栈顺序等于失败:
如何防止序列化程序在序列化期间反转堆栈?
演示小提琴在这里。
c# - System.Text.Json 将字典序列化为数组
是否可以使用 System.Text.Json 将字典序列化(和反序列化)为数组?
而不是{ "hello": "world" }
我需要将我的字典序列化为{ "key": "hello", "value": "world" }
最好,而不必在我的类的字典属性上设置属性。
使用 newtonsoft.json 可以这样: