Для обработки клиентской части существует довольно много ответов, но вы можете изменить выходную серверную сторону, если хотите.
Есть несколько способов приблизиться к этому, я начну с основы. Вам придется подклассифицировать класс JsonResult и переопределить метод ExecuteResult. Оттуда вы можете использовать несколько разных подходов для изменения сериализации.
Подход 1: Реализация по умолчанию использует JsonScriptSerializer . Если вы посмотрите на документацию, вы можете использовать метод RegisterConverters для добавления пользовательских JavaScriptConverters . Есть несколько проблем с этим: JavaScriptConverter сериализуется в словаре, то есть он берет объект и сериализуется в Json-словаре. Чтобы сделать сериализацию объекта строкой, он требует немного хакерства, см. [D2] post .
public class CustomJsonResult: JsonResult {private const string _dateFormat = "yyyy-MM-dd HH: mm: ss"; public override void ExecuteResult (Контекст ControllerContext) {if (context == null) {throw new ArgumentNullException ("context"); } HttpResponseBase response = context.HttpContext.Response; if (! String.IsNullOrEmpty (ContentType)) {response.ContentType = ContentType; } else {response.ContentType = "application / json"; } if (ContentEncoding! = null) {response.ContentEncoding = ContentEncoding; } if (Data! = null) {JavaScriptSerializer serializer = новый JavaScriptSerializer (); // Используйте свой подклассу JavaScriptConverter здесь. serializer.RegisterConverters (новый JavascriptConverter [] {новый CustomConverter}); Response.Write (serializer.Serialize (данные)); }}}
Подход 2 (рекомендуется): Второй подход - начать с переопределенного JsonResult и перейти с другим сериализатором Json, в моем случае Json.NET сериализатор. Это не требует взлома подхода 1. Вот моя реализация подкласса JsonResult:
public class CustomJsonResult: JsonResult {private const string _dateFormat = "yyyy-MM-dd HH: mm : сс "; public override void ExecuteResult (Контекст ControllerContext) {if (context == null) {throw new ArgumentNullException ("context"); } HttpResponseBase response = context.HttpContext.Response; if (! String.IsNullOrEmpty (ContentType)) {response.ContentType = ContentType; } else {response.ContentType = "application / json"; } if (ContentEncoding! = null) {response.ContentEncoding = ContentEncoding; } if (Data! = null) {// Использование сериализатора Json.NET var isoConvert = new IsoDateTimeConverter (); isoConvert.DateTimeFormat = _dateFormat; response.Write (JsonConvert.SerializeObject (данные, isoConvert)); }}}
Пример использования:
[HttpGet] public ActionResult Index () {return new CustomJsonResult {Data = new {users = db.Users. К списку(); }}; }
Дополнительные кредиты: Джеймс Ньютон-Кинг
То, что вы хотите сделать, это перевести консоль в «сырой» режим (редактирование строки исключено и не требуется вводить ключ) в отличие от «приготовленного» режима (редактирование строки с требуемым ключом ввода). В системах UNIX «stty» 'команда может изменять режимы.
Теперь, относительно Java ... см. Неблокирующий вход консоли в Python и Java . Выдержка:
Если ваша программа должна быть на основе консоли, вам нужно переключить свой терминал из линейного режима в режим символов и не забудьте восстановить его до выхода вашей программы. Нет портативного способа сделать это в разных операционных системах.
Одним из предложений является использование JNI. Опять же, это не очень портативно. Другое предложение в конце потока, и вместе с вышеприведенным сообщением, это посмотреть на использование jCurses .
Я написал класс Java RawConsoleInput , который использует JNA для вызова функций операционной системы Windows и Unix / Linux.
_kbhit()
и _getwch()
из msvcrt.dll. tcsetattr()
для переключения консоли в неканонический режим, System.in.available()
, чтобы проверить, доступны ли данные и System.in.read()
, чтобы читать байты с консоли. A CharsetDecoder
используется для преобразования байтов в символы. Он поддерживает неблокирующий входной и смешанный режим raw и обычный вход в линейный режим.
Используйте jline3 :
Пример:
Terminal terminal = TerminalBuilder.builder()
.jna(true)
.system(true)
.build();
// raw mode means we get keypresses rather than line buffered input
terminal.enterRawMode();
reader = terminal .reader();
...
int read = reader.read();
....
reader.close();
terminal.close();
Нет портативного способа чтения необработанных символов с консоли Java.
Некоторые связанные с платформой обходные решения были представлены выше. Но чтобы быть действительно портативным, вам придется отказаться от консольного режима и использовать режим окон, например. AWT или Swing.
System.Console.ReadKey
, который работает на всех платформах. Java также распространяет JVM и JRE для каждой платформы с зависимыми от платформы библиотеками и реализациями, поэтому это не оправдание.
– Martin Macak
7 March 2015 в 18:29
Вам нужно сбить консоль в сырой режим. Там нет встроенного независимого от платформы способа добраться туда. jCurses может быть интересным.
В системе unix это может работать:
String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();
stty cooked </dev/tty
следует запускать, когда программа должна вернуться в буферный режим и, безусловно, перед выходом программы.
– Kelvin
8 May 2017 в 20:21