Атрибут FromBodyAttribute со строковым параметром требует двойных кавычек JSON ASP.NET CORE 2.1 - PullRequest
0 голосов
/ 29 ноября 2018

Для метода Post ниже требуются двойные кавычки JSON в теле, как показано ниже

"{}"

В противном случае, исключение

{"":["Unexpected character encountered while parsing value: {. Path '', line 1, position 1."]}

Метод PostCar ниже принимает JSON без двойных кавычек, как показано ниже,но требуется пользовательская модель вместо строкового типа.

{}

Есть ли способ объявить метод post, такой как метод Post, но публиковать html-тело без двойных кавычек?

 [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        [HttpPost("PostCar")]
        public void PostCar([FromBody] Car car)
        {
        }    
    }

   public class Car
    {
        public string Name { get; set; }          
    }

ЭтоОсобенность .NET Core сбивает с толку !!

Обновления

Мое текущее решение для избежания двойных кавычек для JSON приведено ниже:

Но требуется проверка JSON.

[HttpPost]
        public void Post()
        {     
            using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
            {
                var body = reader.ReadToEnd();                       
            }

        }

https://weblog.west -wind.com / posts / 2017 / Sep / 14 / Принятие необработанных запросов-содержимого-содержимого-в-ASPNET-Core-API-контроллерах # Чтение-Request.Body-for-Raw-Data

Опять же, есть ли лучшее решение вместо использования Request.Body, но как использовать [FromBody]?

[FromBody] со строковым параметром: для этого требуются двойные кавычки, меньше кода, нет проверки JSON?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Мы используем класс DefaultContractResolver, который является частью Newtonsoft.Json.Serialization.Код будет выглядеть следующим образом.

Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
      services.AddMvc().AddJsonOptions(opt =>
      {
        if (opt.SerializerSettings.ContractResolver != null)
        {
          var resolver = opt.SerializerSettings.ContractResolver as DefaultContractResolver;
          resolver.NamingStrategy = null;
        }
      });
    }
0 голосов
/ 29 ноября 2018

Ваш метод post принимает строку, поэтому он не может анализировать объект JSON.Заключение вашего объекта в кавычки, по сути, просто служит для удовлетворения возможности размещения строки JSON в качестве вашего тела.Другими словами, значение value будет буквально равно "{}".Если вам нужно опубликовать JSON-объект, вам нужно связать его с параметром некоторого типа класса:

// POST api/values
[HttpPost]
public void Post([FromBody]MyClass value)
{
}
...