Использование JSON.NET для возврата ActionResult

Я пытаюсь написать метод C #, который будет сериализовать модель и вернуть результат JSON. Вот мой код:

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, когда я перехожу к Words / Read в 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} 

Я думаю, что экранированные кавычки – это проблема, возникающая при двойном сериализации объекта. Из других вопросов: вывод WCF JSON приводит к появлению нежелательных котировок и обратных косых черт

Это определенно похоже, что я дважды сериализую свой объект, так как я сначала сериализую с использованием JSON.NET, а затем передаю свой результат в функцию Json (). Мне нужно вручную сериализовать, чтобы избежать ссылок, но я думаю, что My View требует ActionResult.

Как я могу вернуть ActionResult здесь? Нужно ли мне, или я могу просто вернуть строку?

Я нашел аналогичный вопрос stackoverflow: Json.Net и ActionResult

Ответ там предложил использовать

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

Кажется, это работает на моей очень простой странице.

Вместо сериализации с использованием JSON.NET, а затем вызова Json() , почему бы вместо этого не переопределить метод Json() в вашем controllerе (или, возможно, базовый controller для повышения его повторного использования)?

Это вытащили из этого сообщения в блоге.

В controllerе (или базовом 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 }; } 

И определение для 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()); } } } 

Делая это, когда вы вызываете Json() в своем controllerе, вы автоматически получите сериализацию JSON.NET, которую вы хотите.

  • «Тип не ожидается», используя DataContractSerializer - но это просто class, не смешные вещи?
  • Удаление десериализации JSON в объект с помощью Json.NET
  • Сериализовать компоненты JavaFX
  • Почему, когда конструктор аннотируется с помощью @JsonCreator, его аргументы должны быть аннотированы с помощью @JsonProperty?
  • Сериализация с Qt
  • Есть ли у .NET 4 встроенный сериализатор / десериализатор JSON?
  • Использование jQuery для захвата содержимого из iframe CKEditor
  • Информация о сериализации типов кеша Json.NET?
  • Ошибка JSON.NET Локальный цикл привязки для типа
  • Невозможно сериализовать словарь с помощью сложного ключа с помощью Json.net
  • Когда и почему сущности JPA должны реализовывать интерфейс Serializable?
  • Interesting Posts

    Как определить, подписан ли пользователь Firebase с использованием аутентификации facebook

    Скрыть адрес электронной почты отправителя при отправке от имени

    Почему имя аргумента shorthand $ 0 возвращает кортеж всех параметров?

    Непрозрачность CSS и дочерние элементы

    Сообщите Thunderbird об усечении или обертке строк при отправке электронной почты.

    Как проверить, является ли тип анонимным?

    Как вы создаете генератор паролей писем в пакетном режиме?

    MacBook Pro Trackpad замерзает / удерживает клик на своем собственном

    Должен ли внешний жесткий диск иметь разделы?

    Android Studio: как удалить APK (или выполнить команду adb) автоматически до запуска или отладки?

    Не удается установить MySQL на Mountain Lion

    В JQGrid, возможно ли использовать другой форматтер для группировки итоговой ячейки, отличной от форматирования столбцов?

    Как кэшировать сервис http get в angularjs

    Преобразование XML-файла в CSV-файл с помощью java

    Почему iostream :: eof внутри условия цикла считается неправильным?

    Давайте будем гением компьютера.