2016-04-06 3 views
1

を使用していないプロパティアンマーシャリングUTF-8エンコードされたJSONをして、私は次のようなスプレーフレームワークを使って書かれたAPIの一部のためScalatestを持っている:スプレーテストケースはHTTPEntity

"correctly deserializes multi-lang title metadata" in { 
    implicit def json4sFormats: org.json4s.Formats = ModelJsonHelper.jsonFormats 

    val v2MultiLangTitle = getStringFromResource("/json_samples/cmp.asset.v2.AssetWriteMultiMetadata.json") 

    //Deserialize 
    val v2AssetEither = HttpEntity(`application/cmp.ela.assetWrite.v2+json`, v2MultiLangTitle).as[Asset] 
    v2AssetEither.isRight shouldEqual true 
    v2AssetEither.right.map(asset => { 
    asset.assetMetadata.getOrElse(List()).size shouldEqual(3) 
    asset.assetMetadata.getOrElse(List())(1).language shouldEqual("es") 
    asset.assetMetadata.getOrElse(List())(1).data.title shouldEqual(Some("Encabezado prueba de AFP")) 
    asset.assetMetadata.getOrElse(List())(2).language shouldEqual("tlh") 
    asset.assetMetadata.getOrElse(List())(2).data.title shouldEqual(Some("Daj jaw AFP")) 
    asset.assetMetadata.getOrElse(List())(0).language shouldEqual("de") 
    asset.assetMetadata.getOrElse(List())(0).data.title shouldEqual(Some("Test AFP Überschrift")) 
    }) 
} 

def getStringFromResource(input: String): String = { 
    Source.fromInputStream(this.getClass.getResourceAsStream(input))(Codec.UTF8).getLines.mkString("") 
} 

処理されているJSONがあります次

{ 
    "assetMetadata" : [ 
    { 
     "title": "Test AFP Überschrift", 
     "language": "de" 
    }, 
    { 
     "title": "Encabezado prueba de AFP", 
     "language": "es" 
    }, 
    { 
     "title": "Daj jaw AFP", 
     "language": "tlh" 
    } 
    ] 
} 

と障害がドイツ語のウムラウトで発生している:

[info] - correctly deserializes multi-lang title metadata *** FAILED *** 
[info] Some("Test AFP �berschrift") did not equal "Test AFP Überschrift" (V2AssetWriteMarshallerSpec.scala:367) 

表面には、アンラッピングプロセスで使用されるjson4がいくつかあります。私は直接json4sパーサーを使用している場合しかし、ドイツ語の文字が正しく処理されます。

import scala.io.Source 
import java.io.FileInputStream 
val v = Source.fromInputStream(new FileInputStream("/path/to/project/src/test/resources/json_samples/cmp.asset.v2.AssetWriteMultiMetadata.json")).getLines.mkString("") 
import org.json4s._ 
import org.json4s.native.JsonMethods._ 

val obj = parse(v) 
(obj \ "assetMetadata") 

は私に結果を与える:

res0: org.json4s.JValue = JArray(List(JObject(List((title,JString(Test AFP Überschrift)), .... 

私はスプレー1.3.3と3.2.10 json4s上です。 HttpEntityでその種類は、カスタムタイプであると私はそうのようなパラメータとして("charset" -> "UTF-8")を追加しようとしました:

val `application/cmp.ela.assetWrite.v2+json` = register(
    MediaType.custom(
     mainType = "application", 
     subType = "cmp.ela.assetWrite.v2+json", 
     compressible = true, 
     binary = false, 
     parameters = Map[String,String]("charset" -> "UTF-8") 
    ) 
) 

は、テストがまだ無効な文字で失敗し..but。どのようにしてSprayに国際文字を含む文字列を正しくアンマーシャリングするのですか?

答えて

1

私はあなたがScala IRCチャンネルで解決策を見つけるのを助けました。私はこのリンクを発見し、あなたは残りをやった!

https://github.com/spray/spray/blob/master/spray-http/src/main/scala/spray/http/MediaType.scala#L168

固定テスト:

//Deserialize 
    val v2AssetEither = HttpEntity(`application/vnd.dsa.assetWrite.v2+json` withCharset(HttpCharsets.`UTF-8`), v2MultiLangTitle).as[Asset] 
    v2AssetEither.isRight shouldEqual true 

追加キービーイング

withCharset(HttpCharsets.`UTF-8`) 
関連する問題