.NET Core - Как загрузить файл JSON? - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь загрузить файл 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();
    }

}

Я использую Postman для отправки данных JSON, но каждый раз, когда я пытаюсь это сделать, я получаю следующий ответ:

{"Имя пользователя": ["Ввод неверный."]}

когда я пытаюсь отправить данные JSON как raw-> application / json ИЛИ

{"": ["Ввод неверный."]}

когда я пытаюсь отправить его по форме данных с ключом "file" и файлом test.json в качестве значения.

Не могли бы вы направить меня на правильный путь? Я пытался использовать [FromBody] UserModel user в качестве параметра моего действия, но это позволяет мне обрабатывать только одну строку JSON.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Вам нужно стандартизировать ваш подход, так или иначе. Если вы хотите принять JSON, затем привяжите к параметру действия типа List<UserViewModel> с атрибутом [FromBody] и на стороне клиента используйте JavaScript FileReader, чтобы получить фактическое содержимое загруженного загруженного файла и опубликовать содержимое, а не файл.

Если вы хотите сделать это при загрузке файла, тогда вы можете оставить действие как есть, но затем вам нужно будет отправить свой собственный «JSON» в качестве файла загрузки. Это может быть достигнуто с помощью FormData в JavaScript и созданием Blob вручную из вашего объекта JSON в виде строки.

Длинный и короткий, какой бы путь вы ни выбрали, будьте едины в этом. Невозможно обработать как отправку объекта JSON, так и загрузку файла, который оказывается текстовым файлом с расширением .json в одном действии.

0 голосов
/ 06 сентября 2018

Я решил это ... Все, что мне нужно было сделать, это удалить атрибут [ApiController]. Из-за этого атрибута приложение вообще не посещало мой метод ImportData.

0 голосов
/ 05 сентября 2018

Вы можете использовать [FromBody] IEnumerable<UserModel> users для обработки многих строк. В этом случае json должен выглядеть так:

[
 {
  "userName": "name",
  "password": "password",
 },
 {
  "userName": "name1",
  "password": "password1",
 }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...