4

タイプのオブジェクトがあります

Map[java.util.Locale, String] 

このためにJsonの書き込み/読み取りを行うにはどうすればよいですか? 他のいくつかの 質問を見ましたが、自分で解決策を思いつくことができませんでした. Locale 用の何かを取得しました (ただし、まだテストしていません)

implicit val localeReads: Reads[Locale] = new Reads[Locale] {
  def reads(json: JsValue): JsResult[Locale] =
    json match {
      case JsString(langString) => JsSuccess(new Locale(langString))
      case _ => JsError("Locale Language String Expected")
    }
}

implicit val localeWrites: Writes[Locale] = new Writes[Locale] {
  def writes(locale: Locale) = JsString(locale.toString)
}

これをどのように使用できますか

implicit val myMapReads: Reads[Map[Locale, String]] = ???
implicit val myMapWrites: Writes[Map[Locale, String]] = ???

?

4

2 に答える 2

2

これはうまくいくはずです:

implicit val localeReads: Reads[Locale] = new Reads[Locale] {
  def reads(json: JsValue): JsResult[Locale] =
    json match {
      case JsString(langString) => JsSuccess(new Locale(langString))
      case _ => JsError("Locale Language String Expected")
    }
}

implicit val localeWrites: Writes[Locale] = new Writes[Locale] {
  def writes(locale: Locale) = JsString(locale.toString)
}

implicit val myMapWrites: Writes[Map[Locale, String]] = new Writes[Map[Locale, String]] {
  override def writes(o: Map[Locale, String]): JsValue = Json.toJson(o)
}

implicit val myMapRead: Reads[Map[Locale, String]] = new Reads[Map[Locale, String]] {
  override def reads(json: JsValue): JsResult[Map[Locale, String]] = JsSuccess {
    json.as[JsObject].value.map {
      case (k, v) => (new Locale(k), v.as[String])
    }.toMap
  }
}

Locale基本的に、あなたが提供した のおかげで、play は a を jsonに変換する方法をすでに知っているWritesので、単純に呼び出すだけで機能しtoJsonます。

それはReadsもう少し複雑で、マッピングを行う必要があるため、最初の文字列がオブジェクトを表し、 2 番目の文字列が単純な文字列を.value返すため、呼び出すと既に必要なものが得られます。Map[String, JsValue]Localeas[String]

すべてを でラップしましたJsSuccessが、取得した json を に変換できないと想定しJsObject、try/catch を適用して、成功または失敗を返すかどうかを決定することに注意してください。

于 2015-12-04T10:55:42.983 に答える