标签: jerkson

使用Jerkson将JSON反序列化为用户定义的案例类

我遇到了使用Jerkson在Scala中处理JSON的优秀教程.特别是,我有兴趣将JSON反序列化为用户定义的case类.这篇文章有一个简单的例子

case class Simple(val foo: String, val bar: List[String], val baz: Map[String,Int])

object SimpleExample {
  def main(args: Array[String]) {
    import com.codahale.jerkson.Json._
    val simpleJson = """{"foo":42, "bar":["a","b","c"], "baz":{"x":1,"y":2}}"""
    val simpleObject = parse[Simple](simpleJson)
    println(simpleObject)
  }
}
Run Code Online (Sandbox Code Playgroud)

运行它时出现此错误,我在Play 2.0.1,Scala 2.9.1-1,Jerkson 0.5.0.

Execution exception [[ParsingException: Unable to find a case accessor
Run Code Online (Sandbox Code Playgroud)

在Google网上论坛中也发现了这一点,但没有帮助.

有任何想法吗?

json scala playframework jerkson

7
推荐指数
1
解决办法
3726
查看次数

在Scala中扫描一个巨大的JSON文件以获取可反序列化的数据

我需要能够处理大型JSON文件,从可反序列化的子字符串中实例化对象,因为我们正在迭代/流式传输文件.

例如:

假设我只能反序列化为以下实例:

case class Data(val a: Int, val b: Int, val c: Int)
Run Code Online (Sandbox Code Playgroud)

和预期的JSON格式是:

{   "foo": [ {"a": 0, "b": 0, "c": 0 }, {"a": 0, "b": 0, "c": 1 } ], 
    "bar": [ {"a": 1, "b": 0, "c": 0 }, {"a": 1, "b": 0, "c": 1 } ], 
     .... MANY ITEMS .... , 
    "qux": [ {"a": 0, "b": 0, "c": 0 }  }
Run Code Online (Sandbox Code Playgroud)

我会喜欢做的是:

import com.codahale.jerkson.Json
val dataSeq : Seq[Data] = Json.advanceToValue("foo").stream[Data](fileStream)
// NOTE: this will …
Run Code Online (Sandbox Code Playgroud)

json iterator scala stream jerkson

7
推荐指数
1
解决办法
2414
查看次数

使用Jerkson时,字符串保持JSON的前导和尾随引号

有问题的JSON:

{
"search_id": "",
"type": "Search.filter",
"query": "bar,club",
"params": {
    "search_id": "",
    "user_id": "",
    "client": "ios",
    "lat": 40.73199375351,
    "lon": -74.00080404533901,
    "radius": 20
}
Run Code Online (Sandbox Code Playgroud)

}

检索数据的代码:

val json = Json.parse(new String(body))
println((json \ "search_id") + " | " + (json \ "query"))
println(json)
Run Code Online (Sandbox Code Playgroud)

只打印json JsValue按预期打印出整个JSON.打印出第一个项目会产生:""| "酒吧,俱乐部"

为什么要保持JSON格式的引号?这不是字符串的一部分,它基本上是说引号内的内容是一个字符串.我该如何解决?

json scala jackson playframework-2.0 jerkson

5
推荐指数
1
解决办法
1837
查看次数

结构化scala案例类的自定义json序列化

我有一些工作杰克逊scala模块代码用于往返scala案例类.杰克逊在平面案例课程中工作得非常好,但是当我创建一个包含其他案例类别的列表时,我似乎需要的代码量很多.考虑:

abstract class Message
case class CardDrawn(player: Long, card: Int, mType: String = "CardDrawn") extends Message
case class CardSet(cards: List[CardDrawn], mType: String = "CardSet") extends Message
Run Code Online (Sandbox Code Playgroud)

为了让CardSet与jackson scala模块一起往返于json,我使用了一个用java编写的自定义序列化器/反序列化器:

object ScrumGameMashaller {

  val mapper = new ObjectMapper() 
  val module = new SimpleModule("CustomSerializer")
  module.addSerializer(classOf[CardSet], new CardSetSerializer)
  module.addDeserializer(classOf[CardSet], new CardSetDeserializer)
  val scalaModule = DefaultScalaModule
  mapper.registerModule(scalaModule)
  mapper.registerModule(module)

  def jsonFrom(value: Any): String = {
    import java.io.StringWriter
    val writer = new StringWriter()
    mapper.writeValue(writer, value)
    writer.toString
  }

  private[this] def objectFrom[T: Manifest](value: String): T =
    mapper.readValue(value, typeReference[T])

  private[this] …
Run Code Online (Sandbox Code Playgroud)

scala jackson jerkson

5
推荐指数
1
解决办法
5335
查看次数

如何将泛型类型传递给Argonaut

我试图包装Argonaut(http://argonaut.io),以便在Scala项目中序列化/反序列化JSON.我们之前使用过Jerkson但是因为它已经停产,我们正在寻找替代方案.

这是基本的JSON包装器

import argonaut._, Argonaut._

object Json {
  def Parse[T](input: String): T = {
    input.decodeOption[T].get
  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我得到以下错误.

could not find implicit value for evidence parameter of type argonaut.DecodeJson[T]
    input.decodeOption[T]
                  ^
not enough arguments for method decodeOption: (implicit evidence$6: argonaut.DecodeJson[T]) Option[T].
Unspecified value parameter evidence$6.
    input.decodeOption[T]
                  ^
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的建议或关于我做错的指示将是非常感激的.

关于替代JSON框架的建议也非常受欢迎.

我是Scala/Java的新手,以及泛型如何在那里工作但我多年来一直在编写.NET/C#.

scala jerkson

3
推荐指数
1
解决办法
1772
查看次数

JsonProperty注释不适用于Scala中的Json解析(Jackson/Jerkson)

我需要解析以下 json 字符串:

{“类型”:1}

我正在使用的案例类如下所示:

case class MyJsonObj(
    val type: Int
)
Run Code Online (Sandbox Code Playgroud)

然而,这让 Scala 感到困惑,因为“type”是一个关键字。因此,我尝试使用 Jacson/Jerkson 的 @JsonProperty 注释,如下所示:

case class MyJsonObj(
    @JsonProperty("type") val myType: Int
)
Run Code Online (Sandbox Code Playgroud)

但是,Json 解析器仍然拒绝在 json 中查找“type”字符串,而不是“myType”。以下示例代码说明了该问题:

import com.codahale.jerkson.Json._
import org.codehaus.jackson.annotate._

case class MyJsonObj(
    @JsonProperty("type") val myType: Int
)

object SimpleExample {
  def main(args: Array[String]) {
    val jsonLine = """{"type":1}"""
    val JsonObj = parse[MyJsonObj](jsonLine)
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

[error] (run-main-a) com.codahale.jerkson.ParsingException: Invalid JSON. Needed [myType], but found [type].
Run Code Online (Sandbox Code Playgroud)

PS:如上所示,我正在使用 jerkson/jackson,但如果这能让生活更轻松的话,我不介意切换到其他 json 解析库。

json scala jackson jerkson

1
推荐指数
1
解决办法
4356
查看次数