2013-06-06 9 views
23

2.10のScalaモジュールを使って、ジャクソンのシリアライズ/デシリアライゼーションの簡単な例を教えてもらえますか? Field-by-Fieldアノテーションや割り当てを必要としないリフレクションベースのJSONを探していますが、そうすることができたようですが、ドキュメントには例は含まれていません。Jackson Scalaモジュールの小さな例?

私はケースクラスがある場合:彼らのgithubののreadmeからそう

case class Person(name:String, age:Int) 
val person = Person("Fred", 65) 

val mapper = new ObjectMapper() 
mapper.registerModule(DefaultScalaModule) 

OK、今何を...? pをJSONに/から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) 

EDIT

ちょうどそれがそうでなければ動作しません、トップレベルとしてPersonクラスを宣言してください:

答えて

30

はこの打撃を与えます。ここで

+1

私はただ運でこれを試してみました - readValue呼び出しがで失敗します。 com.fasterxml.jackson.databind.JsonMappingExceptionを:として(匿名/ローカルタイプの)クラスcom.example.JacksonTest $人$ 3デシリアライズすることはできません豆。私は何が欠けていますか? PersonはPersonと同じように宣言できますか?case class Person(name:String、age:Int)? – user48956

+0

@cmbaxter、これをスピードアップする方法はありますか、これは推奨方法ですか?つまり、物事をスピードアップするために注釈を付けることができますか? – Blankman

+0

そのマッパーは、アプリケーション全体で使用されるシングルトンですか? – Blankman

6

は完全な例です:

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> 

これが失敗した理由を任意のアイデア?実際の例との違いはわかりません。

+0

すべていくつかのwどう? –

+4

私はケースクラスを自分のクラスや他の関数の外に移動しなければならなかったので、代わりに完全なトップレベルクラスであり何らかの理由で問題を修正しました。 –

+2

ケースクラスを外部に移動する理由は、テストでケースクラスを定義すると、実際には内部クラスになるためです。これは、親クラスへの参照を必要とすること、そして状況が複雑になることを意味します(Javaの内部クラスを扱う際に同様の問題があります)。あなたがトップレベルのクラスとしてそれを置いて見つけたソリューションは1つのソリューションです。もう一つは、ケースクラスを静的クラスにするオブジェクトの中にケースクラスを置くことです。 –

関連する問題