Я'м пытаюсь написать на C# метод, который будет сериализовать модель и возвращает результат в формате JSON. Здесь's мой код:
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);
}
У меня есть следующие JSON, в результате, когда я иду слова/чтения в 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}
Я думаю, что \" и убежал цитаты-это проблема, которая возникает при сериализации объекта. Из других вопросов: https://stackoverflow.com/questions/22294473/wcf-json-output-is-getting-unwanted-quotes-backslashes-added
Он выглядит, как я'm двойной сериализации мой объект, так как я сначала сериализовать JSON.NET а затем пройти мой результат в формате JSON (функция). Мне нужно сериализовать вручную, чтобы избежать referenceloops, но я думаю, что мое мнение нуждается в ActionResult.
Как я могу вернуться к ActionResult? Нужно ли мне, или я могу просто вернуть строку?
Я нашел похожие и StackOverflow вопрос: https://stackoverflow.com/questions/21938907/json-net-and-actionresult
Нет ответа предложил использовать
return Content( converted, "application/json" );
Что, кажется, работает на моем очень простую страницу.
Вместо сериализации, используя JSON.NET а потом звоню в JSON(), почему бы не переопределить
формат JSON () метод в контроллере (или, возможно, базовый контроллер, чтобы повысить его повторного использования)?
Это вытащил из этого блог.
В ваш контроллер (или контроллер базовой):
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
};
}
И определение 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());
}
}
}
Делая это, когда вы называете `формат JSON () в ваш контроллер, вы автоматически получаете JSON.NET сериализация вы хотите.