json4s/jacksonを使用してHTTPペイロードを直列化および逆シリアル化するScalaで書かれたHTTPクライアントがあります。今はScalaのケースクラスだけをモデルとして使用していましたが、すべてうまくいっていましたが、今はサードパーティのサービスと通信する必要があります。彼らは私に独自のモデルを提供しましたが、Javaで書かれていました。だから、Javaクラスにjsonsを非直列化する必要があります。シンプルなクラスではうまく動作しますが、クラスにリストやマップなどのコレクションが含まれている場合、json4sに問題があり、そのようなフィールドはすべてnull
に設定されます。Scalaとjson4sを使ってJavaオブジェクトにデシリアライズ
このようなケースを処理する方法はありますか?たぶん私は別の形式を使用する必要があります(私はDefaultFormats +カスタムのものを使用しています)。テストで問題の例:
import org.json4s.DefaultFormats
import org.json4s.jackson.Serialization.read
import org.scalatest.{FlatSpec, Matchers}
class JavaListTest extends FlatSpec with Matchers{
implicit val formats = DefaultFormats
"Java List" should "be deserialized properly" in {
val input = """{"list":["a", "b", "c"]}"""
val output = read[ObjectWithList](input)
output.list.size() shouldBe 3
}
}
とサンプルJavaクラス:私も、私は私がよフィールドのjava.util.List[String]
タイプを含むScalaのケースクラスにデシリアライズしようとするでしょう時に気づいている
import java.util.List;
public class ObjectWithList {
List<String> list;
}
タイプの例外を受け取ります:org.json4s.package$MappingException: Expected collection but got List[String]
あまりにも正直なところ私はcirce(長いコンパイルの問題のためjson4sに置き換えられました)を使用しようとしましたが、私のScalaの専門知識のレベルを理解するのが難しいと感じています。私は 'io.circe.generic.auto._'からのデコーダを使用していましたが、それらはJavaデコーダを含んでいません。あなたがcirceにjavaクラスのデコーダがあるかどうか知っていますか?または私がcirceに戻ることにしたら私自身のカスタムデコーダを実装する必要がありますか? –
私が知っている 'generic.auto._'は、' HList'への変換と、 'shapeless'から' Coproduct'を使用しています。これはJavaクラスでは動作しません。私はあなたがcirceでJavaクラスのための独自のデコーダを実装する必要があることが怖いです。 –