This question already has an answer here:
- Json.Net And ActionResult 2 answers
I'm trying to write a C# method that will serialize a model and return a JSON result. Here's my code:
public ActionResult Read([DataSourceRequest] DataSourceRequest request)
{
var items = db.Words.Take(1).ToList();
JsonSerializerSettings jsSettings = new JsonSerializerSettings();
jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
var converted = JsonConvert.SerializeObject(items, null, jsSettings);
return Json(converted, JsonRequestBehavior.AllowGet);
}
I got the following JSON result when I go to Words/Read in Chrome:
"[{\"WordId\":1,\"Rank\":1,\"PartOfSpeech\":\"article\",\"Image\":\"Upload/29/1/Capture1.PNG\",\"FrequencyNumber\":\"22038615\",\"Article\":null,\"ClarificationText\":null,\"WordName\":\"the | article\",\"MasterId\":0,\"SoundFileUrl\":\"/UploadSound/7fd752a6-97ef-4a99-b324-a160295b8ac4/1/sixty_vocab_click_button.mp3\",\"LangId\":1,\"CatId\":null,\"IsActive\":false}
I think the \" escaped quotes are a problem that occurs when you double serialize an object. From other questions: WCF JSON output is getting unwanted quotes & backslashes added
It definitely looks like I'm double serializing my object, since I first serialize using JSON.NET and then pass my result into the Json() function. I need to manually serialize to avoid referenceloops, but I think my View needs an ActionResult.
How can I return an ActionResult here? Do I need to, or can I just return a string?
Instead of serializing using JSON.NET and then calling
Json()
, why not instead override theJson()
method in your controller (or perhaps a base controller to enhance its re-usability)?This is pulled from this blog post.
In your controller (or base controller):
And the definition for JsonNetResult:
By doing this, when you call
Json()
in your controller, you will automatically get the JSON.NET serializing you want.I found a similar stackoverflow question: Json.Net And ActionResult
The answer there suggested using
That seems to work on my very simple page.