如何在Asp.Net Core控制器返回的json中保留属性的大小写?

时间:2018-08-23 10:06:54

标签: json serialization asp.net-core json.net

我们有一些执行ajax调用的旧式js代码,并期望将这些属性命名为Id,Name等。默认情况下,Asp.Net Core骆驼中的json序列化程序会使用返回的实体的属性,但是我怎么知道使用相同的大小写和C#代码?

最好我要为每个控制器设置此值。

3 个答案:

答案 0 :(得分:2)

ASP.NET Core使用Newtonsoft进行序列化,因此它应该像添加

一样简单。

JsonProperty属性归所有属性。

例如

public class ViewModel
{
     [JsonProperty("Id")]
     public string Id { get; set; }
     [JsonProperty("Name")]
     public string Name { get; set; }
}

您还可以通过在

中添加.AddJsonOptions()来在Startup.cs类中设置各种选项。
ConfigureServices(IServiceCollection services)

方法。

答案 1 :(得分:2)

我们的解决方案是一个托管在Sharepoint上的Angular应用程序,它使用了Sharepoint的Web服务,因此只想将其提升并转移到Asp.Net Core上,看看它是否有效。

我最终这样做:

    JsonSerializerSettings _serializerSettings = new JsonSerializerSettings()
    {
        TypeNameHandling = TypeNameHandling.Auto
    };

    [Route("_api/Web/CurrentUser")]
    public IActionResult CurrentUser()
    {

        return Json(new
        {
            d = new
            {
                Id = 123,
                Title = "MyTitle",
                LoginName = "MyLoginName",
                NameId = "MyNameId"
            }
        }, _serializerSettings);
    }

这将返回匿名类型中的大小写。

答案 2 :(得分:1)

要为每个控制器进行设置,您可以尝试IResultFilter或传递JsonSerializerSettings

对于如下所示的控制器:

        public async Task<ActionResult> Test()
    {
        return Ok(new Product { Id = 1, Name = "test" });
    }

Options1

    public async Task<ActionResult> Test()
    {
       return new JsonResult(new Product { Id = 1, Name = "tt" },new Newtonsoft.Json.JsonSerializerSettings { ContractResolver = new DefaultContractResolver() });
    }

Options2

  1. 自定义IResultFilter

    public class JsonSerializeFilter : IResultFilter
    {
    public void OnResultExecuted(ResultExecutedContext context)
    {
    
    }
    
    public void OnResultExecuting(ResultExecutingContext context)
    {
        var result = context.Result as ObjectResult;
        var value = JsonConvert.SerializeObject(result.Value);
        context.Result = new ObjectResult(JsonConvert.SerializeObject(
                result.Value,
                new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() }
            ));
    }
    }
    
  2. 使用JsonSerializeFilter

    [TypeFilter(typeof(JsonSerializeFilter))]
    public async Task<ActionResult> Test()
    {
        return Ok(new Product { Id = 1, Name = "tt" });            
    }