代码之家  ›  专栏  ›  技术社区  ›  Pingpong

带字符串参数的FromBodyAttribute需要JSON ASP.NET Core 2.1的双引号

  •  0
  • Pingpong  · 技术社区  · 6 年前

    下面的post方法需要像下面这样的主体中的JSON双引号

    "{}"
    

    否则,例外

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

    下面的Postcar方法接受没有双引号的JSON,如下所示,但需要自定义模型而不是字符串类型。

    {}
    

    有没有一种方法可以像post方法那样声明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核心功能令人困惑!!

    更新

    我目前的避免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/Accepting-Raw-Request-Body-Content-in-ASPNET-Core-API-Controllers#Reading-Request.Body-for-Raw-Data

    同样,是否有更好的解决方案而不是使用request.body,但像使用[frombody]一样?

    [frombody]带有字符串参数:这需要双引号,代码更少,没有JSON验证?

    2 回复  |  直到 6 年前
        1
  •  0
  •   CREM    6 年前

    我们使用defaultContractResolver类,它是newtonSoft.json.serialization的一部分。代码如下所示。

    启动.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;
            }
          });
        }
    
        2
  •  0
  •   Chris Pratt    6 年前

    post方法接受一个字符串,因此它不能解析JSON对象。将对象括在引号中本质上只是为了满足将JSON字符串作为主体发布的需要。换句话说,价值 value 从字面上来说 "{}" . 如果需要发布JSON对象,那么需要绑定到某个类类型的参数:

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