json - ASP.NET MVC DataBinder 没有从 JSON 反序列化简单类型
问题描述
输入 JSON:
{ "name": "gerry" }
动作方法:
{ public ActionResult GenerateQrCode([FromBody] string name }
问题:
- 简单类型参数为空
- 模型状态:无效
- 内置的 json 反序列化器无法处理这种形式的输入
我试过了:
ConfigureServices()
->services.AddControllersWithViews().AddNewtonsoftJson();
切换到我知道/喜欢的 NewtonSoft- 我已经在非 NewtonSoft 内置 MS 中设置了一个断点,
SystemTextJsonInputFormatter.ctor()
只是为了检查它是否仍在使用:是的,它是,我不知道为什么,当我调用上面的.AddNewtonsoftJson()
情况:
- 客户端将所有输入参数 POST 为一个 JSON 字符串文档,即 UTF8 w/out BOM
- 该字符串来自服务器端,并且可以
new System.IO.StreamReader(Request.Body).ReadToEnd()
从即时窗口内部很好地阅读 - 我需要一种 ASP.NET Core 反序列化它的方法,因为它可以在 .NET4.X 下使用多年而没有任何问题
- 我不想
[FromBody]
在整个服务器操作/参数中添加类似的选择加入签名
解决方案
您将名称作为 json 传递,但作为字符串接受,因此它将为空,您可以使用 InputFormatter,例如:
public class RawJsonBodyInputFormatter : InputFormatter
{
public RawJsonBodyInputFormatter()
{
this.SupportedMediaTypes.Add("application/json");
}
public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
{
var request = context.HttpContext.Request;
using (var reader = new StreamReader(request.Body))
{
var content = await reader.ReadToEndAsync();
return await InputFormatterResult.SuccessAsync(content);
}
}
protected override bool CanReadType(Type type)
{
return type == typeof(string);
}
}
在startup.cs中:
services
.AddMvc(options =>
{
options.InputFormatters.Insert(0, new RawJsonBodyInputFormatter());
});
然后你可以得到行字符串
要对其进行反序列化,您可以检查它,使用 Newtonsoft 并将字符串设置为模型
[HttpPost]
public IActionResult GenerateQrCode([FromBody] string name)
{
object o = JsonConvert.DeserializeObject(name);
MyModel my = JsonConvert.DeserializeObject<MyModel>(o.ToString());
return View();
}
推荐阅读
- javascript - Safari CSS SVG在动画后消失
- javascript - 如何以角度设置封装的子组件的样式?
- javascript - 配置 Babel + ESLint 时遇到“找不到模块”
- r - 使用 Dataframe 自动创建基于子产品的值列表
- python - 在文本文件中搜索值,然后找到值所在的标头
- python - How to implement Django multiple user types, while one user can have different role according to the project he/she is working on?
- javascript - Axios 和 App 对外部 api 的 GET/POST 请求
- python - Matplotlib:尝试迭代dict并设置不同的轴范围时得到空白子图
- mule - Mule 4:使用附件调用 SOAP 服务
- function - 输入参数 .bin 文件不足