如何在反序列化之前使用 System.Text.Json 验证 JSON

     2023-03-09     252

关键词:

【中文标题】如何在反序列化之前使用 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&lt;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类的客户端应... 查看详情