Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json Jackson Scala模块的小示例?_Json_Scala_Jackson - Fatal编程技术网

Json Jackson Scala模块的小示例?

Json Jackson Scala模块的小示例?,json,scala,jackson,Json,Scala,Jackson,有人能给我举一个简单的例子,说明2.10版本的Scala模块的Jackson序列化/反序列化吗?我正在寻找不需要逐字段注释或赋值的基于反射的JSON,这似乎可以做到,但他们的文档中没有示例 如果我有一个案例类: case class Person(name:String, age:Int) val person = Person("Fred", 65) 因此,从他们的github自述中: val mapper = new ObjectMapper() mapper.registerModule

有人能给我举一个简单的例子,说明2.10版本的Scala模块的Jackson序列化/反序列化吗?我正在寻找不需要逐字段注释或赋值的基于反射的JSON,这似乎可以做到,但他们的文档中没有示例

如果我有一个案例类:

case class Person(name:String, age:Int)
val person = Person("Fred", 65)
因此,从他们的github自述中:

val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
好吧,现在怎么办。。。?如何将p转换为JSON?

试一试:

val person = Person("fred", 25)
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)    

val out = new StringWriter
mapper.writeValue(out, person)
val json = out.toString()
println(json)

val person2 = mapper.readValue(json, classOf[Person])
println(person2)
编辑


只需确保将
Person
类声明为顶级,否则它将无法工作。

下面是一个完整的示例:

package com.example.samples

import org.junit.Test
import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.context.annotation.Bean
import java.io.File
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import java.io.StringWriter

class JacksonTest {

  @Test
  @throws[Exception] def jacksonTest(): Unit = {

    //case class Person(var name: String = "", var age: Int = 0)
    //case class Person(@Bean var name: String, @Bean var age: Int)
    case class Person( name: String, age: Int )

    val person = Person("fred", 25)
    val mapper = new ObjectMapper()
    mapper.registerModule(DefaultScalaModule)

    val out = new StringWriter
    mapper.writeValue(out, person)
    val json = out.toString()
    println(json)

    val person2 = mapper.readValue(json, classOf[Person])
    println(person2)
  }
}
但是,这在mapper.readValue上失败

这是我的配置:

<!-- Jackson libraries for JSON marshalling and unmarshalling -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.2.3</version>
</dependency>

<!-- Jackson module for scala object marshalling and unmarshalling -->
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-scala_2.10</artifactId>
    <version>2.2.2</version>
</dependency>

<!-- Scala Compiler -->
<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-compiler</artifactId>
    <version>2.10.2</version>
</dependency>

com.fasterxml.jackson.core
杰克逊数据绑定
2.2.3
com.fasterxml.jackson.module
jackson-module-scala_2.10
2.2.2
org.scala-lang
scala编译器
2.10.2

你知道为什么会失败吗?我看不出与工作示例有什么不同。

我创建了一个通用函数,用于将
JSON字符串转换为Case Class/Object
,并将
Case Class/Object转换为JSON字符串

build.SBT
文件中需要的SBT依赖项:

name:=“杰克逊示例”
规模厌恶:=“2.12.11”
libraryDependencies+=“com.fasterxml.jackson.module”%%“jackson模块scala”%%“2.10.1”
libraryDependencies+=“com.fasterxml.jackson.core”%“jackson数据绑定”%“2.10.1”
JSON字符串到Case类/对象

def fromJson[T](json:String)(隐式m:Manifest[T]):选项[T]={
试一试{
lazy val mapper=带有ScalaObjectMapper的新ObjectMapper()
mapper.registerModule(DefaultScalaModule)
configure(在未知属性上反序列化feature.FAIL,false)
mapper.readValue[T](json)
}匹配{
案例成功率(x)=>部分(x)
案例失败(错误)=>{
logger.error(“@@@@Got”+err.getMessage()+”而JSON到对象:-->“+JSON)
没有一个
}
}
}
将Case类/对象转换为JSON字符串

def-toJson[T](obj:T)(隐式m:Manifest[T]):选项[String]={
试一试{
lazy val mapper=带有ScalaObjectMapper的新ObjectMapper()
mapper.registerModule(DefaultScalaModule)
configure(在未知属性上反序列化feature.FAIL,false)
mapper.writeValueAsString(obj)
}匹配{
案例成功率(x)=>部分(x)
案例失败(错误)=>{
logger.error(“@@@@Got”+err.getMessage()+”将对象转换为JSON:-->“+obj时)
没有一个
}
}
}

我只是尝试了一下,但没有成功——readValue调用失败,原因是:com.fasterxml.jackson.databind.JsonMappingException:无法将类com.example.JacksonTest$Person$3(类型为local/anonymous)反序列化为Bean。我错过了什么?Person是否可以准确地声明为:case class Person(name:String,age:Int)?@cmbaxter,有没有办法加快速度,或者这是他们推荐的方法?i、 e.你能通过注释来加快速度吗?@Blankman,如果我错了,请纠正我,但是java中的运行时注释是通过反射提供的,所以使用它们不会帮助你避免反射。有一些基于宏的scala json框架通过宏生成ser/deser代码并避免反射。我认为Play和Scala Pickling都有基于宏的json处理,可能还有一些。@DeanHiller,解决方案运行得很好。我猜user48956是唯一一个我认为有问题的类,它没有将Person case类声明为顶级类,而是将它嵌套在另一个类/对象中。你不能这样做,因为我不相信需要访问的东西(构造函数)是可访问的。若你们们宣布这个人是顶级人物,那个么事情就很好(或者至少在一年前我发布这个答案时他们做得很好)。不确定这是否真的值得否决……如果您想要即时字符串输出,只需使用
mapper.writeValueAsString(person)
即可。您是否以某种方式使用了此解决方案?好,我不得不将我的case类移动到我的类和其他函数之外,因此它是一个完整的顶级类,并且出于某种原因修复了这个问题。将case类移动到外部的原因是,当您在测试中定义case类时,它实际上是一个内部类。这意味着它需要有一个对父类的引用,这就是事情变得复杂的地方(在java中处理内部类时也有类似的问题)。您发现的将其作为顶级类的解决方案是一种解决方案。另一个是将case类放在一个对象中,这使它成为一个静态类,一切都很好。