使用Scala进行无噪声JSON处理

Eug*_*ako 15 dsl json scala

我来自一个dotnet的土地,但最近一直在研究替代编程语言的可能性.没有什么比这更重要的了,只是在这里和那里.最近我发现了Scala,我非常着迷它.尽管有非确定性的修补,但我已经对C#中的一些重要事项做了一些中间检查,我感到相当满意:功能概念 - tick,ad-hoc多态 - tick,注释 - tick,reflection和codegen - tick.

现在我正在考虑如何在DLR和"动态"语法糖的帮助下编写我在C#4.0中实现的JSON处理库的模拟.这是我正在寻找的功能集:

  1. 方便浏览和构建原始JSON.
  2. JSON和本机对象/集合之间的自动转换(在一般形式中,问题是无法解决的,尽管可以定义95%的时间可以工作的约定 - 这对我来说很好).

C#4.0的新功能在这里有点摇滚,因为它们让我覆盖成员访问和类型转换以执行完全自定义逻辑(如果C#4.0中的变量被输入为"动态",那么你用它做的任何事情都将被编译成调用具有合理默认行为的程序员定义的方法 - 有关详细信息,请参阅MSDN上的DynamicMetaObject.BindXXX方法.例如,我重写了类型转换以序列化/反序列化.NET对象和成员访问以管理原始JSON,以便我可以编写以下代码:

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

当然,这并不理想,因为C#4.0中的动态绑定存在扩展方法和类型推断的问题,而且,代码仍然感觉相当重量级.但无论如何,这比使用所有那些((JsonObject)json ["quux"])["baz"]要好得多在c#3.5中.

一些基础研究表明,Scala没有支持后期绑定的专用语言功能.然而,有很多技巧可能它们可以一起用于创建上面显示的代码的可承受仿真(甚至更好 - 我几乎可以肯定这是可能的).拜托,请你在这里告诉我什么?

tyl*_*eir 15

Scala的一个有用的JSON库是lift-json,它是Lift Web Framework的独立组件.

https://github.com/lift/framework/tree/master/core/json

它支持提取类,解析和用于创建JSON的DSL.

我链接的页面有一个全面的教程,所以我不会只是复制和粘贴它.


Von*_*onn 6

你一定要看看sjson.这里 - > github上的sjson 我正在使用基于Type类的实现,你可以在这里仔细阅读 - > 一些例子 如果你对代码有一个短途旅行,那么有一些非常有趣的scala技巧.这应该会给你关于#2的所需信息.SJSON包装dispatch-json,我认为它提供了与lift-json的集成(如上所述).dispatch-json/lift-json都应该为你提供你在#1中寻找的东西.为了它的价值我一直在一个大型项目中使用sjson并且它正在游泳.这个项目背后的绅士非常了不起,并且很好地支持了这个项目.


sro*_*uck 5

我在使用lift-json和各种变体sjson(例如dabasishg/sjson)和最近Jerkson(杰克逊的Scala包装器)之间浮现.

出于对象序列化和反序列化的目的,我一直在寻找Jerkson需要最少的调整来完成工作,例如,我刚刚编写了一个简单的对象序列化,其代码case class如下所示:

import org.joda.time.LocalDate

case class UserStatus(subscriptionEndDate: LocalDate = null)
Run Code Online (Sandbox Code Playgroud)

我有两个各种错误lift-jsonsjson,但jerkson只是工作:

import com.codahale.jerkson.Json

val jsonString = Json.generate(statusObject)
Run Code Online (Sandbox Code Playgroud)

val newObject = Json.parse[UserStatus](jsonString)
Run Code Online (Sandbox Code Playgroud)