Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不使用客户端JSON.Parse进行HTTP响应的情况下使用JsonConvert.SerializeObject和JsonResult_C#_Asp.net_Json_Asp.net Mvc - Fatal编程技术网

C# 如何在不使用客户端JSON.Parse进行HTTP响应的情况下使用JsonConvert.SerializeObject和JsonResult

C# 如何在不使用客户端JSON.Parse进行HTTP响应的情况下使用JsonConvert.SerializeObject和JsonResult,c#,asp.net,json,asp.net-mvc,C#,Asp.net,Json,Asp.net Mvc,当我有一个直接的对象时,我可以使用ASP.NET MVC控制器进行序列化,如下所示: public JsonResult Program(int id, int userId) { return Json(GetPrograms(userId).FirstOrDefault(f => f.Id == id), JsonRequestBehavior.AllowGet); } 客户端,我的响应是一个Javascript对象: 现在,我希望我的响应JSON具有如下CamelCase

当我有一个直接的对象时,我可以使用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,我将以下代码添加到我的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。这是一个字符串响应,我必须使用Javascript
JSON.parse
,Web客户端调用控制器并处理响应

是否有任何方法可以简化我的属性并序列化JSON对象JsonResult?

我试过JObject:

var serializer = new JsonSerializer()
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
JObject.FromObject(obj, serializer);
但这根本不起作用my JsonResult是一堆空数组:

这将起作用

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

这里有一个答案:。重要的部分是创建您自己的
JsonResult
的链接,但您始终需要在客户端使用
JSON.parse
将JSON字符串转换为JavaScript对象。有时候,像jQuery这样的库对您隐藏了这一步骤,但这种情况确实发生了。@GabrielLuci-hmm也许,我不是在使用jQuery,而是在使用Javascriptfetch@GabrielLuci你一定是弄错了,因为我使用相同的客户端Javascript调用我的控制器端点,当使用JsonConvert.SerializeObject时,它是一个JSON字符串,而不仅仅是当使用JSON(obj)包含(直接或作为链接)几乎所有通过自定义序列化返回JSON的合理方法时。看起来这正是您要寻找的,问题的第二部分(关于
JSON.parse
)是由于双重转换(对象到JSON字符串到带字符串的JSON)导致的,当实际返回原始对象的JSON时,这种转换应该消失。这确实有效,尽管我不确定这是否理想,仍然返回一个JsonResult会很好,因为它符合许多ASP.NET MVC应用程序中看到的ASP.NET MVC通用模式。我不认为使用JsonResult类有什么特殊的区别或性能优势,除非它将ContentType设置为application/json(如果尚未设置)。它还使用javascript序列化程序序列化数据(比json转换器快吗?),并将序列化数据写入响应流。不,我不反对,只是JsonResult的模式始终是最理想的返回类型。我非常感谢您的回答,并对其投了赞成票