如何检测Web Api Post请求Json中的重复键

2024-05-06

当请求 Json 包含重复键时,我需要从 ASP.NET Web API Post 请求返回 400 错误。

例如,如果请求是

{
   "key1": "value1",
   "key2": 1000,
   "key2": 2000,
   "key3": "value3"
}

那么我希望由于有两个“key2”键而引发错误。

我的控制器方法看起来像

[HttpPost]
public IHttpActionResult PostMethod([FromBody]RequestModel request)
{
   .....
}

和我的 RequestModel 模型一样

public class RequestModel
{
    [Required]
    public string Key1 {get; set; }

    [Required]
    public int Key2 {get; set; }

    public string Key3 {get; set; } 
}

在上面的示例中,Json 序列化程序似乎很乐意接受请求并使用 2000 或密钥的最后一个实例填充 Key2。

我想我需要做一些涉及 JsonSerializerSettings 类的事情,或者实现自定义 JsonConverter,但是我不确定如何继续。


这是一个自定义的 JsonConverter,它会抛出一个HttpResponseException当遇到重复的键时,代码为 400,Asp.Net Web API 应自动处理它。

class DuplicateJsonConverter : JsonConverter
{
    public override bool CanWrite { get { return false; } }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var paths = new HashSet<string>();
        existingValue = existingValue ?? Activator.CreateInstance(objectType, true);

        var backup = new StringWriter();

        using (var writer = new JsonTextWriter(backup))
            do
            {
                writer.WriteToken(reader.TokenType, reader.Value);

                if (reader.TokenType != JsonToken.PropertyName)
                    continue;

                if (string.IsNullOrEmpty(reader.Path))
                    continue;

                if (paths.Contains(reader.Path))
                       throw new HttpResponseException(HttpStatusCode.BadRequest); //as 400

                paths.Add(reader.Path);
            }
            while (reader.Read());

        JsonConvert.PopulateObject(backup.ToString(), existingValue);
        return existingValue;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

你应该装饰你的RequestModel使用此转换器的类。

[JsonConverter(typeof(DuplicateJsonConverter))]
class RequestModel
{
  \\...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测Web Api Post请求Json中的重复键 的相关文章

随机推荐

  • 在 Emacs Paredit 中交换括号和方括号

    如何在 paredit 模式下定义交换括号和方括号的命令 所以任务就是把它变成这样 例如 blah a b c 进入这个 blah a b c 使用 paredit 模式 移至表达式的开头 a 进而 C M SPC
  • 在 bootstrap 4 中将页脚刷新到页面底部

    我正在使用引导程序4 我的模板结构是这样的 div div div div
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • Ruby 中@@ 和@ 有什么区别? [复制]

    这个问题在这里已经有答案了 我刚刚开始学习 Ruby 一直无法找到关于 和 在类变量方面的区别的很好的解释 如果有人可以提供一个基本的直观示例 那就太好了 另外它们可以互换吗 前缀为的变量 是一个类变量 前缀为 是一个实例变量 在这个答案中
  • 使用护照库访问 Microsoft Graph API 时,CompactToken 解析失败,错误代码:80049217

    我在用 passport azure ad oauth2 npm 模块 以获取访问令牌 然后我可以将其传递给 MS Graph API passport use new AzureAdOAuth2Strategy clientID proc
  • 如何在模块中使用“before_action”

    我想在模块中使用 before action 不幸的是 我无法让它发挥作用 我正在谷歌搜索 但我发现的一切都无法解决问题 我的模块文件如下所示 module ShowController include SimpleController b
  • 在 Elastic 搜索中加载示例数据集时出错

    您好 我正在尝试加载示例数据集参考弹性搜索文档 https www elastic co guide en elasticsearch reference current exploring your data html但是当我尝试运行指示
  • 如何正确实现TBitmap的扫描线访问?

    我正在尝试根据以下方式访问位图的扫描线关于内河码头的文章 http edn embarcadero com article 29173 使用像这样的扫描线 for y 0 to n do begin line bitmap scanline
  • 不使用 Web 服务器编写简单的 Microsoft 图形客户端

    我正在寻找编写一个脚本来更新 Office365 中的通讯组列表 我正在学习 MS Graph API 并且已经让 python REST 示例可以工作 看来所有示例 Graph API 代码 无论语言或平台如何 都假设我正在以一种或另一种
  • 如何将 Tesseract 导入 Angular2 (TypeScript)

    我正在尝试将 Tesseract 导入 Angular2 TypeScript 我可以看到它保存到 node modules 文件夹中 但是在使用时 import Tesseract from types tesseract js it s
  • MassTransit AzureServiceBus 生成的队列

    我有一个托管在 Azure Service Fabric 解决方案中的 MT 设置的工作配置 我有一个发送消息的 API 和一个读取消息的无状态应用程序 在无状态应用程序中 我告诉它使用类型的消息TestMessage具有以下内容 cont
  • Facebook 自定义消息共享

    当我点击网站上的 Facebook 分享按钮时 我需要添加自定义消息 默认情况下 文本显示 对此说些什么 当我点击 Facebook 分享按钮时 我想将此消息更改为自定义消息 有没有办法用 sharer php 做到这一点 就像参数 t c
  • 按两个字段对 Python 列表进行排序 [重复]

    这个问题在这里已经有答案了 我从排序的 csv 创建了以下列表 list1 sorted csv1 key operator itemgetter 1 我实际上想按两个标准对列表进行排序 首先按字段 1 中的值 然后按字段 2 中的值 我该
  • 在 CASE 语句中使用 CAST 时出现数据转换错误

    运行以下命令时出现错误 将数据类型 nvarchar 转换为 float 时出错 declare completeCommand nvarchar max x paramVal nvarchar 100 paramName nvarchar
  • C# 数据类型到 SQL Server 数据类型

    如何将 C 数据类型 转换 为 SQL Server 数据类型 SqlDbType是已知的 i e C gt String SQL Server gt N String 尝试这个 它是一个 Extension 类 因此您要在文件上添加以下方
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含
  • 在 Shapely 中向现有多边形添加新点

    如何修改现有的多边形 首先 我想在其外部添加一个点 poly Polygon 0 0 1 1 1 0 我一直在寻找这样的东西 poly append at idx 3 Point 1 1 但我找不到任何类似的方法来做到这一点 添加或删除点是
  • Javascript 链接在 selenium excel vba 中没有响应

    我正在尝试做这样一行点击 javascript 链接的操作 FindElementById ctl00 ContentPlaceHolder1 LinkButton4 WaitDisplayed True 3000 Click 这条线没有任
  • 为 Visual Studio 2012 编译 Qt 4.8.x

    我应该采取哪些步骤来编译适用于 Visual Studio 2012 的 Qt 版本 4 8 x 我已经仔细遵循了已接受答案中的说明这个问题 https stackoverflow com questions 5601950 how to
  • 如何检测Web Api Post请求Json中的重复键

    当请求 Json 包含重复键时 我需要从 ASP NET Web API Post 请求返回 400 错误 例如 如果请求是 key1 value1 key2 1000 key2 2000 key3 value3 那么我希望由于有两个 ke