Бесшумная обработка JSON с помощью Scala

Я из дотнет-земли, но недавно я изучал возможности альтернативных языков программирования. Ничего серьезного, только кое-что здесь и там. Недавно я обнаружил Scala, и я очень очарован этим. Несмотря на недетерминированные манипуляции, я сделал несколько промежуточных проверок вещей, которые важны для меня в C #, и я чувствую себя довольно удовлетворенным: функциональные понятия - тик, специальный полиморфизм - тик, аннотации - тик, отражение и кодоген - тик.

Теперь я думаю о том, как можно запрограммировать аналог библиотеки обработки JSON, которую я реализовал в C # 4.0, с помощью DLR и «динамического» синтаксического сахара. Вот набор функций, которые я ищу:

Удобный просмотр и построение необработанного JSON.Автоматическое преобразование между JSON и нативными объектами / коллекциями (в общем виде проблема неразрешима, хотя можно определить соглашения, которые будут работать 95% времени - и это хорошо для меня).

Новые возможности C # 4.0 вроде бы здесь, так как они позволяют мне переопределять доступ к элементам и приведение типов для выполнения полностью настраиваемой логики (если переменная в C # 4.0 напечатана как «динамическая», то все, что вы с ней делаете, будет скомпилировано в вызовы определенные программистом методы с разумным поведением по умолчанию - см.Методы DynamicMetaObject.BindXXX в MSDN для получения дополнительной информации). Например. Я переопределил приведение типов для сериализации / десериализации объектов .NET и доступа к членам для управления необработанным JSON, чтобы я мог написать следующий код:

var json = Json.Get("http://some.service");
if (json.foo) Console.WriteLine((Foo)json.foo);
json.bars = ((List<Bar>)json.bars).DoSomething();

Конечно, это не идеально, так как динамическое связывание в C # 4.0 имеет проблемы с методами расширения и выводом типов, и, кроме того, код все еще выглядит довольно тяжелым. Но в любом случае, это гораздо лучше, чем использовать все те ((JsonObject) json ["quux"]) ["baz"], которые я использовал в c # 3.5.

Некоторые базовые исследования показывают, что в Scala нет специальных языковых функций, поддерживающих позднюю привязку. Тем не менее, существует так много хитростей, что, возможно, их можно использовать вместе, чтобы создать переносимую эмуляцию кода, показанного выше (или даже лучше - я почти уверен, что это возможно). Не могли бы вы посоветовать мне что-нибудь здесь?

Ответы на вопрос(6)

Ваш ответ на вопрос