Usando JSON.NET para retornar ActionResult

Eu estou tentando escrever um método c # que irá serializar um modelo e retornar um resultado JSON. Aqui está meu código:

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); } 

Recebi o seguinte resultado JSON quando vou para Words / Read no 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} 

Eu acho que o \ “citações com escape são um problema que ocorre quando você duplica serializar um object. De outras perguntas: saída WCF JSON está recebendo citações indesejadas e barras invertidas adicionados

Definitivamente parece que estou duplicando duplamente o meu object, já que primeiro serializo usando JSON.NET e depois passo meu resultado para a function Json (). Eu preciso serializar manualmente para evitar referenceloops, mas acho que meu modo de exibição precisa de um ActionResult.

Como posso devolver um ActionResult aqui? Preciso ou posso simplesmente retornar uma string?

Eu encontrei uma questão stackoverflow semelhante: Json.Net And ActionResult

A resposta sugeriu usar

 return Content( converted, "application/json" ); 

Isso parece funcionar na minha página muito simples.

Em vez de serializar usando JSON.NET e, em seguida, chamar Json() , por que não replace o método Json() em seu controlador (ou talvez um controlador base para aumentar sua capacidade de reutilização)?

Isso é retirado desta postagem do blog.

No seu controlador (ou controlador base):

 protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) { return new JsonNetResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior }; } 

E a definição para JsonNetResult:

 public class JsonNetResult : JsonResult { public JsonNetResult() { Settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, }; } public JsonSerializerSettings Settings { get; private set; } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) throw new InvalidOperationException("JSON GET is not allowed"); HttpResponseBase response = context.HttpContext.Response; response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType; if (this.ContentEncoding != null) response.ContentEncoding = this.ContentEncoding; if (this.Data == null) return; var scriptSerializer = JsonSerializer.Create(this.Settings); using (var sw = new StringWriter()) { scriptSerializer.Serialize(sw, this.Data); response.Write(sw.ToString()); } } } 

Ao fazer isso, quando você chamar Json() em seu controlador, obterá automaticamente a serialização JSON.NET desejada.