我遇到了使用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文件,从可反序列化的子字符串中实例化对象,因为我们正在迭代/流式传输文件.
例如:
假设我只能反序列化为以下实例:
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:
{
"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格式的引号?这不是字符串的一部分,它基本上是说引号内的内容是一个字符串.我该如何解决?
我有一些工作杰克逊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) 我试图包装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#.
我需要解析以下 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 解析库。