【发布时间】: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);
}
现在我希望我的响应 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);
【问题讨论】:
-
这里有一个答案: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