2016-06-28 6 views
2

私はスカラ座-JSONここhttps://github.com/MediaMath/scala-jsonのscala-JSONのアンシリアライズは

を使用してScala.jsにおけるケースクラスにAjaxリクエストからJSONに変換しようとしているが、私のクラスでありますこのコードはただ黙ってコンソールに出力されません変換し、「here3」との文字列に死ぬ

import json._ 
implicit val msgDataAcc = ObjectAccessor.create[MsgData] 
implicit val commentErrorAcc = ObjectAccessor.create[CommentError] 

println("here2") 
val errors = JValue.fromString(req.responseText).toObject[CommentError] 
println("here3") 

:私は変換しようとしている方法です。ここ

サーバから私のJSONである:

{ "obj.comment":[{ "MSG":[ "error.minLength"]、 "引数":[10]}]、「OBJ .name ":[{" msg ":[" error.path.missing "]" args ":[]}]}

私は間違っていますか?これを修正するには?

答えて

0

私はこれがscala-jsだと推測しています。 scala-jsアプリケーションのトップレベル(エントリーポイント)で発生する例外は、環境/ブラウザーによっては必ず正しくエコーされるとは限りません。試しに全体をラップし、キャッチすると、スローされた例外が正常に表示されます。

上記の主な問題は、ケースクラスに「アクセサ」を定義する必要があることです。これを行うには2つの方法があります.1つはそれぞれの型に暗黙的に追加されています。もう1つはマクロパラダイスを必要とし、ケースクラスのアクセサを定義するもっと簡単な方法を提供します。ここ

は、正常な非マクロ天国の方法である:

case class MsgData(msg: Seq[String], args: Seq[Int]) extends Msg 
object MsgData { 
    implicit val acc = ObjectAccessor.create[MsgData] 
} 

case class CommentError(@name("obj.comment") comment: Seq[MsgData]) extends Error 
object CommentError { 
    implicit val acc = ObjectAccessor.create[CommentError] 
} 

暗黙に(Scalaの暗黙のための原則以下)の任意の場所に配置することができます。コンパニオンオブジェクトにそれらを配置することは、特別なインポートや必要なことなしに、暗黙的なものがどこにでも見つかることを保証する最善の方法です。

これはcirceのような他のlibsよりも「マジカルではありません」とは、自動的に工場を派生させるためにシェイプレスを使用します。 scala-jsonは、拡張の目的でアクセサーを可視に保つことを目指していますが、これにより明白な定型句につながります。

これはマクロの楽園を使用してまで縮小することができます。

@accessor case class MsgData(msg: Seq[String], args: Seq[Int]) extends Msg 
@accessor case class CommentError(@name("obj.comment") comment: Seq[MsgData]) extends Error 

これは、上記のコードとまったく同じことを行い、私たちはコンパニオンオブジェクトに暗黙の「ACC」フィールドを追加するマクロの楽園を活用します自動的に。

関連する問題