首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查JSON中的重复属性

检查JSON中的重复属性
EN

Stack Overflow用户
提问于 2021-06-11 03:48:10
回答 1查看 287关注 0票数 2

我们正在开发一个基于.Net核心的web api应用程序,为此,我们需要验证传入的请求体,它是基于c#的类型的JSON格式。此时我们正在评估NJsonSchema库,看看它是否抛出重复属性错误。但是看起来它不支持这个验证。我们还检查了NewtonSoftJSON模式验证器,但它似乎也不支持重复的属性验证。

下面是我们使用的NJsonSchema的最小化代码-

代码语言:javascript
复制
using NewtonSoft.Json;
public class MyRequest
    {
        [JsonRequired]
        [JsonProperty("name")]
        public string Name { get; set; }
}

当我们像这样传递一个JSON对象时-

代码语言:javascript
复制
{"name":"abc","name":"xyz"}

我们需要我们的JSON验证器为duplicate property抛出错误,我们的示例测试如下所示-

代码语言:javascript
复制
[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库,或者这可以使用NJsonSchemaNewtonSoft来完成。

EN

回答 1

Stack Overflow用户

发布于 2021-06-11 05:10:13

正如@zaggler注意到的,使用Newtonsoft,您可以使用DuplicatePropertyNameHandling枚举。不幸的是,您不能直接在对DeserializeObject的调用中使用它(在JsonSerializerSettings中);它必须在JToken阅读器中使用。有关更多详细信息,请参阅此讨论线程:

https://github.com/JamesNK/Newtonsoft.Json/issues/931

下面是一个以DeserializeObject-esque的方式包装动作的方法:

代码语言:javascript
复制
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://dotnetfiddle.net/EfpzZu

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67927616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档