.NETCore-如何上载JSON文件?

.NETCore-如何上载JSON文件?,json,asp.net-mvc,api,asp.net-core,Json,Asp.net Mvc,Api,Asp.net Core,我试图上传JSON文件,以便从中读取值并将其保存在数据库中,但我对此有问题。我的控制器代码如下所示: [Produces("application/json")] [Route("api/[controller]")] [ApiController] public class ImportController : ControllerBase { private readonly DatabaseContext dbContext; public ImportControll

我试图上传JSON文件,以便从中读取值并将其保存在数据库中,但我对此有问题。我的控制器代码如下所示:

[Produces("application/json")]
[Route("api/[controller]")]
[ApiController]
public class ImportController : ControllerBase
{

    private readonly DatabaseContext dbContext;

    public ImportController(DatabaseContext dbContext)
    {
        this.dbContext = dbContext;
    }

    [HttpPost]
    public IActionResult ImportData(IFormFile file)
    {
        var content = string.Empty;

        using (var reader = new StreamReader(file.OpenReadStream()))
        {
            content = reader.ReadToEnd();
        }

        List<UserModel> userObjects = null;
        try
        {
            userObjects = JsonConvert.DeserializeObject<List<UserModel>>(content);
        }
        catch
        {
            return BadRequest();
        }

        foreach (var user in userObjects)
        {

             UserModel us = new UserModel
             {
                 Username = user.Username,
                 Password = user.Password
             };

             dbContext.User.Add(us);
             dbContext.SaveChanges();
        }

        return Ok();
    }

}
[产生(“应用程序/json”)]
[路由(“api/[控制器]”)]
[ApiController]
公共类导入控制器:ControllerBase
{
私有只读数据库上下文dbContext;
公共导入控制器(DatabaseContext dbContext)
{
this.dbContext=dbContext;
}
[HttpPost]
公共IActionResult导入数据(格式文件)
{
var content=string.Empty;
使用(var reader=newstreamreader(file.OpenReadStream()))
{
content=reader.ReadToEnd();
}
List userObjects=null;
尝试
{
userObjects=JsonConvert.DeserializeObject(内容);
}
抓住
{
返回请求();
}
foreach(userObjects中的var user)
{
UserModel us=新的UserModel
{
Username=user.Username,
Password=user.Password
};
dbContext.User.Add(us);
dbContext.SaveChanges();
}
返回Ok();
}
}
我正在使用Postman发送JSON数据,但每当我尝试这样做时,都会得到以下响应:

{“用户名”:[“输入无效。”]}

当我尝试以原始->应用程序/JSON或

{“”:[“输入无效。”]}

当我尝试通过表单数据发送它时,键名为“file”,test.json file作为值


你能给我指路吗?我尝试使用
[FromBody]UserModel user
作为我操作的参数,但它只允许我处理一个JSON字符串。

您可以使用
[FromBody]IEnumerable users
处理多行。在这种情况下,json应该如下所示:

[
 {
  "userName": "name",
  "password": "password",
 },
 {
  "userName": "name1",
  "password": "password1",
 }
]

您可以使用
[FromBody]IEnumerable users
处理多行。在这种情况下,json应该如下所示:

[
 {
  "userName": "name",
  "password": "password",
 },
 {
  "userName": "name1",
  "password": "password1",
 }
]

您需要以某种方式标准化您的方法。如果要接受JSON,则使用
[FromBody]
属性绑定到类型为
List
的操作参数,并在客户端使用JavaScript的
FileReader
获取上载文件的实际内容并发布内容,而不是文件

如果您想通过文件上传来完成,那么您可以保持操作的原样,但是您还需要发送您自己的“JSON”作为文件上传。这可以通过在JavaScript中使用
FormData
并从JSON对象手动创建一个
Blob
字符串来实现


无论你选择哪条道路,无论长短,都要保持一致。无法在同一操作中同时处理发布JSON对象和恰好是扩展名为
.JSON
的文本文件的文件上载。

您需要以某种方式标准化您的方法。如果要接受JSON,则使用
[FromBody]
属性绑定到类型为
List
的操作参数,并在客户端使用JavaScript的
FileReader
获取上载文件的实际内容并发布内容,而不是文件

如果您想通过文件上传来完成,那么您可以保持操作的原样,但是您还需要发送您自己的“JSON”作为文件上传。这可以通过在JavaScript中使用
FormData
并从JSON对象手动创建一个
Blob
字符串来实现


无论你选择哪条道路,无论长短,都要保持一致。在同一个操作中,无法同时处理发布JSON对象和恰好是扩展名为
.JSON
的文本文件的文件上载。。。我所要做的就是删除
[ApiController]
属性。具有该属性导致应用程序根本没有访问我的ImportData方法。

我解决了它。。。我所要做的就是删除
[ApiController]
属性。具有该属性导致应用程序根本没有访问my ImportData方法。

因此,您没有上载文件,但实际上是在请求中发布文件。显示您的请求示例,当“它只允许我处理一个JSON字符串”时,您的请求是什么。请确保在postman中使用
多部分/表单数据
,并且POST@YeldarKurmangaliyev-这()是我请求的示例,我根据AlexRiabov的回答更改了代码,现在当我尝试发布许多JSON值时,它可以正常工作,但当我尝试在Postman中使用file而不是raw application/JSON时,它就不起作用了。是的,通过“它只允许我处理一个JSON字符串”,我的意思是不管我尝试传递多少JSON值,只读取第一个JSON值。但这个问题现在已经解决了。Konrad-这是POST,我尝试使用多部分/表单数据,但没有帮助。因此,您没有上载文件,但实际上是在请求中发布文件。显示您的请求示例,当“它只允许我处理一个JSON字符串”时,您的请求是什么。请确保在postman中使用
多部分/表单数据
,并且POST@YeldarKurmangaliyev-这()是我请求的示例,我根据AlexRiabov的回答更改了代码,现在当我尝试发布许多JSON值时,它可以正常工作,但当我尝试在Postman中使用file而不是raw application/JSON时,它就不起作用了。是的,通过“它只允许我处理一个JSON字符串”,我的意思是不管我尝试传递多少JSON值,只读取第一个JSON值。但这个问题现在已经解决了。康拉德-这是帖子,我尝试使用多部分/表单数据,但没有帮助。谢谢你的回答。当我尝试以第一种方式发布JSON时,这个解决方案工作得非常好,但当我尝试以第二种方式发布JSON时,仍然会出现相同的错误(正如您在这个屏幕截图上看到的:)。JSON字符串在这两种情况下都是相同的,跟踪表示执行ObjectResult,写入类型值