我们正在开发一个基于.Net核心的web api应用程序,为此,我们需要验证传入的请求体,它是基于c#的类型的JSON格式。此时我们正在评估NJsonSchema库,看看它是否抛出重复属性错误。但是看起来它不支持这个验证。我们还检查了NewtonSoft的JSON模式验证器,但它似乎也不支持重复的属性验证。
下面是我们使用的NJsonSchema的最小化代码-
using NewtonSoft.Json;
public class MyRequest
{
[JsonRequired]
[JsonProperty("name")]
public string Name { get; set; }
}当我们像这样传递一个JSON对象时-
{"name":"abc","name":"xyz"}我们需要我们的JSON验证器为duplicate property抛出错误,我们的示例测试如下所示-
[Test]
public async System.Threading.Tasks.Task SchemaValidation_WithDuplicateProperty_Async()
{
var jsonString = await File.ReadAllTextAsync("Data//JsonWithDuplicateProperty.json");
var schema = JsonSchema.FromType<MyRequest>();
var errors = schema.Validate(jsonString);
Assert.That(errors.Count(), Is.EqualTo(1));
}所以我的问题是--过去有没有人这样做过?或者有没有为重复属性提供JSON验证的.net core库,或者这可以使用NJsonSchema或NewtonSoft来完成。
发布于 2021-06-11 05:10:13
正如@zaggler注意到的,使用Newtonsoft,您可以使用DuplicatePropertyNameHandling枚举。不幸的是,您不能直接在对DeserializeObject的调用中使用它(在JsonSerializerSettings中);它必须在JToken阅读器中使用。有关更多详细信息,请参阅此讨论线程:
https://github.com/JamesNK/Newtonsoft.Json/issues/931
下面是一个以DeserializeObject-esque的方式包装动作的方法:
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
public class Program
{
public static void Main()
{
var json = @"{""name"":""abc"",""name"":""xyz""}";
var objA = DeserializeObject<MyRequest>(json, new JsonSerializerSettings(), DuplicatePropertyNameHandling.Ignore);
Console.WriteLine(".Ignore: " + objA.Name);
var objB = DeserializeObject<MyRequest>(json, new JsonSerializerSettings(), DuplicatePropertyNameHandling.Replace);
Console.WriteLine(".Replace: " + objB.Name);
var objC = DeserializeObject<MyRequest>(json, new JsonSerializerSettings(), DuplicatePropertyNameHandling.Error);
Console.WriteLine(".Error: " + objC.Name); // throws error before getting here
}
public static T DeserializeObject<T>(string json, JsonSerializerSettings settings, DuplicatePropertyNameHandling duplicateHandling)
{
JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
using (var stringReader = new StringReader(json))
using (var jsonTextReader = new JsonTextReader(stringReader))
{
jsonTextReader.DateParseHandling = DateParseHandling.None;
JsonLoadSettings loadSettings = new JsonLoadSettings {
DuplicatePropertyNameHandling = duplicateHandling
};
var jtoken = JToken.ReadFrom(jsonTextReader, loadSettings);
return jtoken.ToObject<T>(jsonSerializer);
}
}
}
public class MyRequest
{
[JsonRequired]
[JsonProperty("name")]
public string Name { get; set; }
}输出:
JSON .Ignore: abc .Replace: xyz运行时异常(第31行):当前
对象中已存在名为' name‘的属性。路径'name',第1行,位置21。
请参见:
https://stackoverflow.com/questions/67927616
复制相似问题