关键词:
【中文标题】如何在反序列化之前使用 System.Text.Json 验证 JSON【英文标题】:How to validate JSON using System.Text.Json before deserialization 【发布时间】:2021-07-15 19:27:27 【问题描述】:在 .NET Core 5.0 中,使用 System.Text.Json.JsonSerializer Deserialize(someJsonFile) 我得到:
System.Text.Json.JsonException: 'The JSON value could not be converted to System.Guid. Path: $.someGuid | ..
这是预期的,因为 someGuid 属性是 System.Guid 类型,并且 JSON 文件/字符串中 someGuid 的值是:
"someGuid": ""
无法正确反序列化..(因为它不是 Guid.Empty)..
我的问题。
在反序列化之前验证 Json(通常)有什么好的和通用的实现?像 TryParse 或 JsonDocument.Parse?当然,try-catch 但这很脏(恕我直言)。
顺便说一句:我不想使用 Newtonsoft
感谢您的建议(当然还有批评者)。
【问题讨论】:
好像在road-map。有可用的第 3 方解决方案。 我认为你被 try/catch 或为每种类型和一些反序列化验证代码实现自己的转换器卡住了。 【参考方案1】:我使用示例创建了一个自定义转换器,答案是:The JSON value could not be converted to System.Int32
public class StringToGuidConverter : JsonConverter<Guid>
public override Guid Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
if (reader.TokenType == JsonTokenType.String)
ReadOnlySpan<byte> span = reader.ValueSpan;
if (Utf8Parser.TryParse(span, out Guid guid, out int bytesConsumed) && span.Length == bytesConsumed)
return guid;
if (Guid.TryParse(reader.GetString(), out guid))
return guid;
return Guid.Empty;
public override void Write(Utf8JsonWriter writer, Guid value, JsonSerializerOptions options)
writer.WriteStringValue(value.ToString());
在我的例子中,我的模型要反序列化为不能采用 Nullable Guid,所以我返回一个空的 GUID,然后在我的逻辑中验证它。
因为我使用 .Net 标准创建了一个 web api,所以我无法在启动类的服务中注册它。但是您可以在调用 Deserialize 方法时使用 JsonSerializerOptions 属性注册自定义转换器,如下所示:
var options = new JsonSerializerOptions
PropertyNameCaseInsensitive = true,
Converters = new NERDS.API.Helpers.StringToGuidConverter()
;
StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream);
string json = reader.ReadToEnd();
return JsonSerializer.Deserialize<T>(json, options);
【讨论】:
Protobuf-net r282 在反序列化使用 r249 序列化的对象时遇到问题
】Protobuf-netr282在反序列化使用r249序列化的对象时遇到问题【英文标题】:Protobuf-netr282havingproblemsdeserializingobjectserializedwithr249【发布时间】:2010-09-0823:48:15【问题描述】:我刚刚从r249更新到r282。除了替换dll我没有做任何改变。... 查看详情
在反序列化期间使用 XML 装饰指定默认值
】在反序列化期间使用XML装饰指定默认值【英文标题】:UsingXMLdecorationstospecifydefaultvaluesduringde-serialization【发布时间】:2011-03-3008:49:09【问题描述】:我在反序列化某些XML时遇到问题;第三方提供的XML非常冗长,因此如果没有为... 查看详情
在反序列化时使用动态和强制执行 WCF 合同
】在反序列化时使用动态和强制执行WCF合同【英文标题】:UsingDynamicandenforcingWCFcontractuponDeserialization【发布时间】:2020-11-1104:15:37【问题描述】:我有两个模型类IntroModel和PhonePageModel。这些都是WCF合同。我正在调用一个返回JSON... 查看详情
JsonSerializer 在反序列化期间不使用内部构造函数
】JsonSerializer在反序列化期间不使用内部构造函数【英文标题】:JsonSerializernotusinginternalconstructorduringdeserialization【发布时间】:2021-12-0814:13:19【问题描述】:我正在编写一个库来访问用于管理后端系统中的数据的WebAPI。该库还... 查看详情
在 xml 序列化期间忽略属性,但在反序列化期间不忽略
】在xml序列化期间忽略属性,但在反序列化期间不忽略【英文标题】:Ignoreapropertyduringxmlserializationbutnotduringdeserialization【发布时间】:2013-08-1700:44:00【问题描述】:在C#中,如何让XmlSerializer在序列化期间忽略属性,但在反序列... 查看详情
Gson 在反序列化对象时忽略 null
】Gson在反序列化对象时忽略null【英文标题】:Gsonignorenullwhendeserializingobject【发布时间】:2016-01-2221:54:51【问题描述】:我想反序列化一个在Java中包含空值的json字符串。我想将对象反序列化为Properties对象。json字符串类似于:"p... 查看详情
在反序列化过程中出现下一个异常:“源数据中的无效字段:0”。如何找出源代码中的原因/错误位置?
】在反序列化过程中出现下一个异常:“源数据中的无效字段:0”。如何找出源代码中的原因/错误位置?【英文标题】:Igetnextexceptionduringdeserialization:"Invalidfieldinsourcedata:0".Howtofigureoutthereason/wrongplaceinsourcecode?【发布时... 查看详情
Spring数据redis在反序列化List类型时返回null
】Spring数据redis在反序列化List类型时返回null【英文标题】:SpringdataredisreturnsnullondeserializingListtype【发布时间】:2019-02-0816:43:23【问题描述】:我正在使用springdataredis,我的一个实体有一个如下列表。@RedisHash("person")@Data@Builderpubl... 查看详情
取消转义后如何转义嵌入的 JSON
...时间】:2019-01-2113:04:11【问题描述】:当使用Json.NET进行序列化时,我需要在反序列化之前取消转义后转义嵌入的JSON。这意味着我根据this帖子未转义JSON。这是我的JSON:"Message":null,"Error":false,"VData":"RNumber":null,"BR 查看详情
ServiceStack 文本设置以在反序列化 json 时推断原始值类型
】ServiceStack文本设置以在反序列化json时推断原始值类型【英文标题】:ServiceStackTextsettingtoinferprimitivevaluestypeswhiledeserializingjson【发布时间】:2014-10-0701:49:20【问题描述】:我有一个在运行时生成的带有x个属性的json,因此我不能... 查看详情
在反序列化期间将 JSON 日期转换为 .NET DateTime 的正确方法
】在反序列化期间将JSON日期转换为.NETDateTime的正确方法【英文标题】:ProperWaytoConvertJSONDateto.NETDateTimeDuringDeserialization【发布时间】:2012-09-1101:29:33【问题描述】:我有一个使用JSON数据调用MVC控制器的javascript函数:varspecsAsJson=JS... 查看详情
Newtonsoft.JSON 在反序列化数组中被双引号包围的对象时窒息
】Newtonsoft.JSON在反序列化数组中被双引号包围的对象时窒息【英文标题】:Newtonsoft.JSONchokesondeserializingobjectthat\'ssurroundedbydoublequotesinanarray【发布时间】:2021-12-1607:29:42【问题描述】:我正在使用Newtonsoft.JSON序列化List<UserData... 查看详情
基于 BERT 的 NER 模型在反序列化时给出不一致的预测
】基于BERT的NER模型在反序列化时给出不一致的预测【英文标题】:BERT-basedNERmodelgivinginconsistentpredictionwhendeserialized【发布时间】:2021-02-1301:28:17【问题描述】:我正在尝试在Colab云GPU上使用HuggingFace转换器库训练NER模型,将其腌... 查看详情
我可以让 XmlSerializer 在反序列化时忽略命名空间吗?
】我可以让XmlSerializer在反序列化时忽略命名空间吗?【英文标题】:CanImakeXmlSerializerignorethenamespaceondeserialization?【发布时间】:2010-10-2614:21:42【问题描述】:我是否可以让XmlSerializer在反序列化时忽略名称空间(xmlns属性),这... 查看详情
用于在反序列化期间忽略未知属性的 SpringMVC 全局设置
】用于在反序列化期间忽略未知属性的SpringMVC全局设置【英文标题】:SpringMVCglobalsettingforignoringunknownpropertiesduringdeserialization【发布时间】:2021-11-0202:58:27【问题描述】:SpringBoot默认设置“spring.jackson.deserialization.fail-on-unknown-prop... 查看详情
Django REST Framework 序列化程序字段必需=false
】DjangoRESTFramework序列化程序字段必需=false【英文标题】:DjangoRESTFrameworkserializerfieldrequired=false【发布时间】:2013-11-1520:08:56【问题描述】:来自文档:只读将此设置为True以确保在序列化表示时使用该字段,但在反序列化期间更... 查看详情
在反序列化期间获取任何深度的xmlelement(代码片段)
我是c#和XML反序列化的新手,请原谅我任何错误的单词/遗漏任何信息。我使用根元素反序列化Nunit3测试结果XML作为测试运行,子元素是测试套件,然后是测试用例。测试用例重复多次,具体取决于执行的测试用例的数量以及我... 查看详情
Asp Core 3.1 API JsonIgnore (not) 在反序列化中被忽略
】AspCore3.1APIJsonIgnore(not)在反序列化中被忽略【英文标题】:AspCore3.1APIJsonIgnore(not)ignoredindeserialization【发布时间】:2020-08-2808:00:12【问题描述】:我有这个设置Asp核心3.1API在API和客户端之间发送的MyClass共享库带有Com类的客户端应... 查看详情