【问题标题】:How to use JsonConvert.SerializeObject and JsonResult without using client JSON.Parse for HTTP Response [duplicate]如何在不使用客户端 JSON.Parse 进行 HTTP 响应的情况下使用 JsonConvert.SerializeObject 和 JsonResult [重复]
【发布时间】:2019-10-31 01:19:41
【问题描述】:

当我有一个简单的对象时,我可以像这样使用 ASP.NET MVC 控制器进行序列化:

public JsonResult Program(int id, int userId)
{
    return Json(GetPrograms(userId).FirstOrDefault(f => f.Id == id), JsonRequestBehavior.AllowGet);
}

客户端,我的响应是一个 Javascript 对象:

现在我希望我的响应 JSON 具有如下 CamelCase 属性名称:

所以使用 JSON.NET 和 SO answer 我将此代码添加到我的 ASP.NET MVC 控制器:

var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
var json = JsonConvert.SerializeObject(program, serializerSettings);

所以问题来了,JsonConvert.SerializeObject 返回一个 JSON 字符串,所以当这里用作 JsonResult 时:

public JsonResult Program(int id, int userId)
{
    var serializerSettings = new JsonSerializerSettings();
    serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    var json = JsonConvert.SerializeObject(program, serializerSettings);
    return Json(json, JsonRequestBehavior.AllowGet);
}

这真的不是一个 JsonResult,就像我在问题中返回的第一个 sn-p 代码一样。这是一个字符串响应,我必须使用 Javascript JSON.parse 和 Web 客户端调用控制器并处理响应。

有什么办法可以将我的属性进行骆驼拼写并序列化 JSON 对象 JsonResult?

我已经尝试过 JObject:

var serializer = new JsonSerializer()
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
JObject.FromObject(obj, serializer);

但这根本不起作用,我的 JsonResult 是一堆空数组:

【问题讨论】:

  • 这里有一个答案:Force lowercase property names from Json() in ASP.NET MVC。重要的部分是创建您自己的JsonResult 的链接
  • 但是您总是需要在客户端使用JSON.parse 将 JSON 字符串转换为 JavaScript 对象。有时,像 jQuery 这样的库对你隐藏了这一步——但它确实发生了。
  • @GabrielLuci 嗯,也许我没有使用 jQuery,我使用的是 Javascript fetch
  • @GabrielLuci 你一定是在某种程度上弄错了,因为我使用相同的客户端 Javascript 来调用我的 Controller 端点,并且在使用 JsonConvert.SerializeObject 时它是一个 JSON 字符串,而不是在使用时json(obj)
  • stackoverflow.com/questions/17244774/… 包含(直接或作为链接)几乎所有通过自定义序列化返回 JSON 的合理方法。看起来正是您正在寻找的内容,问题的第二部分(关于JSON.parse)是由于双重转换(对象到JSON字符串到带有字符串的JSON),当实际返回原始对象的JSON时应该消失。

标签: c# asp.net json asp.net-mvc


【解决方案1】:

这会起作用

  public object Program(int id, int userId)
  {
      var serializerSettings = new JsonSerializerSettings();
      serializerSettings.ContractResolver = new 
      CamelCasePropertyNamesContractResolver();
      var json = JsonConvert.SerializeObject(program, serializerSettings);
      return json;
}

【讨论】:

  • 这确实有效,虽然我不确定它是否理想,但仍然返回一个 JsonResult 会很好,因为它符合许多 ASP.NET MVC 应用程序中常见的 ASP.NET MVC 模式跨度>
  • 我不认为使用 JsonResult 类有特定的差异或性能优势,只是它将 ContentType 设置为 application/json 如果尚未设置。它还使用 javascript 序列化程序(比 json 转换器更快?)对数据进行序列化,并将序列化后的数据写入响应流。
  • 不,我不反对,这只是 JsonResult 的模式一如既往的理想返回类型
  • 非常感谢您的回答并投了赞成票
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 2020-06-23
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多