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

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

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

  1. Удобный просмотр и построение необработанного JSON.
  2. Автоматическое преобразование между 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)json.bars).DoSomething();

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

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

15
задан Eugene Burmako 1 November 2010 в 00:15
поделиться