2016-09-06 3 views
1

Я развиваюсь для .NET Core, поэтому я использую нестабильную последнюю альфа-версию Noda Time (2.0.0-alpha20160729). Данные обрабатываются с помощью JSON.Пользовательский конвертер JSON для Noda Time

Я буду принимать ввод пользователя для даты рождения, и я хочу поддерживать несколько форматов ввода, если пользователь не может следовать указаниям получает путаницу. Например, я хочу принять и MM-dd-yyyy и M/d/yy, и другие.

serialization docs конкретно указывается следующее:

Пользовательские преобразователи могут быть легко созданы с использованием шаблонов NodaPatternConverter.

Я не могу для жизни меня выяснить, как это сделать. Из того, что я понимаю, мне нужно будет реализовать как NodaPatternConverter<LocalDate> себя, IPattern<LocalDate> для синтаксического анализа, так и Action<T> для проверки.

Я начал писать IPattern.Parse<LocalDate>, но эта функция возвращает ParseResult<LocalDate>, которая, по-видимому, недоступна. Он не может быть создан или использован каким-либо образом, который я нашел. Поэтому я застрял.

Как правильно создать пользовательский конвертер JSON для Noda Time?

ответ

8

Во-первых, это не похоже на правильную работу в преобразователе JSON. Если вы принимаете пользовательский ввод непосредственно в своем JSON, это должно рассматриваться как строка, а позже - ИМО. JSON - это формат «машина-машина», а не формат «человек-машина». Предполагая, что это веб-приложение, вы можете использовать moment.js для анализа данных на клиенте и переформатировать его как ISO-8601. В качестве альтернативы десериализуйте его как строку и , затем преобразуйте его в свой код на стороне сервера.

Во всяком случае, для преобразователя JSON вам нужно только реализовать IPattern<LocalDate> - вам не нужно реализоватьNodaPatternConverter<LocalDate> как уже существует. Вам просто нужно:

var pattern = ...; 
var converter = new NodaPatternConverter<LocalDate>(pattern); 

Теперь, чтобы реализовать свой шаблон, вы, вероятно, хотите, чтобы фактически создать его из существующих моделей - написать реализацию, которая делегирует одного IPattern<LocalDate> за другим, пока результатом является ParseResult<T>, который является успешным - или вернуть окончательный неудачный ParseResult<T>. Обратите внимание: ParseResult<T> недоступен, но вы не можете (в настоящее время) создать свой собственный экземпляр. Это то, о чем я, вероятно, должен обратиться, но в этом случае вам действительно не нужно.

Код, который вам нужен, но не выставлен - вы хотите, чтобы Parse часть CompositePattern. Чтобы реализовать часть Format, вы можете просто использовать первый из своих шаблонов для форматирования значения ... если вам даже нужно.

+0

А, хорошо, я проверю это и отчитаю. Я думал, что конвертер будет лучшим местом для обработки валидации _and_ преобразования, если он будет успешным, вместо того, чтобы иметь как строку, так и «LocalDate» на моей модели и заполнять последнюю из первой. (Это беспорядок в Json.net тоже, пытаясь использовать один для сериализации, а другой для десериализации. Но я отвлекаюсь.) – vaindil

Смежные вопросы