I'm mencoba untuk menulis sebuah C# metode yang akan membuat model dan mengembalikan JSON hasil. Berikut ini's my kode:
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);
}
Aku punya JSON berikut hasilnya ketika saya pergi untuk kata-Kata/Baca di 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}
Saya pikir \" lolos dari kutipan ini adalah sebuah masalah yang terjadi ketika anda klik dua cerita bersambung objek. Dari pertanyaan-pertanyaan lainnya: https://stackoverflow.com/questions/22294473/wcf-json-output-is-getting-unwanted-quotes-backslashes-added
Ini pasti terlihat seperti saya'm double serialisasi objek saya, sejak saya pertama kali menggunakan cerita bersambung JSON.NET dan kemudian lulus hasil saya ke Json() fungsi. Saya perlu manual cerita bersambung untuk menghindari referenceloops, tapi saya pikir saya Melihat kebutuhan ActionResult.
Bagaimana saya bisa kembali ActionResult di sini? Apakah saya perlu, atau aku bisa mengembalikan sebuah string?
Saya menemukan sejenis stackoverflow pertanyaan: https://stackoverflow.com/questions/21938907/json-net-and-actionresult
Jawabannya tidak disarankan menggunakan
return Content( converted, "application/json" );
Yang tampaknya bekerja pada saya yang sangat sederhana halaman.
Bukan serialisasi menggunakan JSON.NET dan kemudian memanggil Json()
, mengapa tidak sebaliknya menimpa Json()
metode di controller anda (atau mungkin dasar controller untuk meningkatkan re-usability)?
Ini lebih menarik dari ini blog post.
Di controller (atau controller):
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
};
}
Dan definisi untuk 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
&& "GET".Equals(
context.HttpContext.Request.HttpMethod,
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());
}
}
}
Dengan melakukan hal ini, ketika anda menelepon Json()
pada controller anda, secara otomatis anda akan mendapatkan JSON.NET serialisasi yang anda inginkan.