scala - 将超过22个元素的json解析为case类

Cab*_*ero 12 json scala

之前发布过这个问题或类似的问题,但是没有一个解决方案可以用于最新的库.经过广泛搜索,我发现没有证据表明最流行的图书馆spray-jsonplay-json(或他们的插件)的最新版本可以处理这种情况.有没有什么能够将超过22个元素的json解析为scala case类?由于scala 2.11案例类不再限于22个元素.请,只有完全可行的解决方案.明显的json示例如下.

{
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4,
    "e": 5,
    "f": 6,
    "g": 7,
    "h": 8,
    "i": 9,
    "j": 10,
    "k": 11,
    "l": 12,
    "m": 13,
    "n": 14,
    "o": 15,
    "p": 16,
    "q": 17,
    "r": 18,
    "s": 19,
    "t": 20,
    "u": 21,
    "v": 22,
    "w": 23
}
Run Code Online (Sandbox Code Playgroud)

更新:这是一个你无法控制json结构的情况,例如它是从第三方api中检索的.twitter的推文json的一个例子:http://pastebin.com/h8fHAsd8

Tra*_*own 13

circe,由Shapeless支持自动编解码器派生.请注意,与json4s的case类解码不同,这里没有发生运行时反射:

case class Foo(
  a: Int, b: Int, c: Int, d: Int, e: Int, f: Int, g: Int, h: Int, i: Int,
  j: Int, k: Int, l: Int, m: Int, n: Int, o: Int, p: Int, q: Int, r: Int,
  s: Int, t: Int, u: Int, v: Int, w: Int
)

import io.circe.generic.auto._, io.circe.jawn.decode

val json = """{
  "a": 1, "b": 2, "c": 3, "d": 4, "e": 5, "f": 6, "g": 7, "h": 8, "i": 9,
  "j": 10, "k": 11, "l": 12, "m": 13, "n": 14, "o": 15, "p": 16, "q": 17,
  "r": 18, "s": 19, "t": 20, "u": 21, "v": 22, "w": 23
}"""

val result: cats.data.Xor[io.circe.Error, Foo] = decode[Foo](json)
Run Code Online (Sandbox Code Playgroud)

这是一个最小的build.sbt文件:

scalaVersion := "2.11.7"

addCompilerPlugin(
  "org.scalamacros" % "paradise" % "2.1.0-M5" cross CrossVersion.full
)

libraryDependencies ++= Seq(
  "io.circe" %% "circe-core" % "0.1.1",
  "io.circe" %% "circe-generic" % "0.1.1",
  "io.circe" %% "circe-jawn" % "0.1.1"
)
Run Code Online (Sandbox Code Playgroud)

即将发布的0.2.0版本(目前作为快照提供)包括对泛型推导的许多改进,但对于这样的简单示例,0.1.1行为是相同的.