2017-03-11 26 views
2

======更新:Javaでスカラー逆シリアル化されたオブジェクトを逆シリアル化する

Javaの注釈付きのScalaクラスは、Javaで直列化することができます。

case class B @JsonCreator()(@JsonProperty("test")test: Boolean) 

これは機能します(以前の問題を処理します)。することができません 構文:私は

mapper.readValue("{\"test\": false}", B.class); 

をデシリアライズするためのオプション[ブール] ..

case class B @JsonCreator()(@JsonProperty("test")test: Option[Boolean]) 

Javaコードを使用する場合は例外

com.fasterxml.jackson.databind.JsonMappingExceptionをスローしますスカラーのインスタンス。オプション、問題:抽象タイプ は、具体的な型にマップするか、カスタムデシリアライザを持つか、または をインスタンス化する必要があります。追加の型情報と

===更新終了====

私がプレイJSONを使用して直列化し、残りのサービスを介して送信されるScalaのクラスを、持っています。 Scalaクラスを使用してJavaプログラムでこのjsonを非直列化したいとします。例を明確にする:

//A.scala 
package my.scala 
class A (test: Boolean) 

//B.scala 
package my.scala 

case class B(test: Boolean) 


//MyProg.java 
package my.java 
import com.fasterxml.jackson.databind.ObjectMapper; 
public class MyProg { 

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue("{\"test\": false}", A.class); 

//this one too fails. 
//mapper.readValue("""{"test": false}""", B.class); 
} 

私は、次の取得の例外をmapper.ReadValue

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class my.java.A]: can not instantiate from JSON object (need to add/enable type information?) 
at [Source: { 
    "test": false 
}; line: 2, column: 3] 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) 

に私の第一の目的は、ケースクラスを直列化復元することでした。しかし、私はそのケースクラスをジャーソンの注釈@ JSONCreatorを追加せずに逆シリアル化することはできません、私はそれを追加する疲れを読んだが、どちらも動作しませんでした。

それから、通常のscalaクラスを使用しようとしましたが、それでも動作しません。どのように私はJavaで私のdeserializedスカラクラスを使用して行くのですか?

+2

「私は通常のJavaクラスを使用しようとしました」 - それはどういう意味ですか?あなたはおそらく無引数のコンストラクタを逃した –

+1

ここで答えられた質問:http://stackoverflow.com/questions/28270621/using-jackson-to-de-serialize-a-scalacase-class –

+0

Willis、私はそれを試みた私はエラーscala.Optionを取得しています。 "com.fasterxml.jackson.databind.JsonMappingException:scala.Optionのインスタンスを構築できません。問題:抽象型を具体的な型にマッピングするか、カスタムデシリアライザを使用するか、追加の型情報でインスタンス化する必要があります。" – konquestor

答えて

1

私は、Scalaのオブジェクト上

//MyProg.java 
package my.java 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.module.scala.DefaultScalaModule; 

public class MyProg { 

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

mapper.readValue("{\"test\": false}", A.class); 

mapper.readValue("""{"test": false}""", B.class); 
} 

@JacksonCreatoerと@JacksonProperty注釈が必要だった私のオブジェクトマッパーにScalaModuleを登録することで、問題を解決しました。

関連する問題