gpt4 book ai didi

json - Map[Locale, String] 的 Scala Play Json 格式

转载 作者:行者123 更新时间:2023-12-03 19:55:15 24 4
gpt4 key购买 nike

我有类型的对象

Map[java.util.Locale, String] 

我怎样才能为此进行 Json 写入/读取?我看过 couple other questions ,但自己想不出解决办法。我得到了(但还没有测试过)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]] = ???

?

最佳答案

这应该有效:

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到 json 因为 Writes您提供的只是调用 toJson将工作。

对于 Reads它有点复杂,你必须做一个映射, .value返回 Map[String, JsValue]其中第一个代表 Locale对象,第二个是一个简单的字符串,所以调用 as[String]已经会给你你想要的了。

请注意,我已将所有内容包装在 JsSuccess 中但是你可能会认为你得到的 json 不能转换为 JsObject ,应用 try/catch,然后决定是返回成功还是失败。

关于json - Map[Locale, String] 的 Scala Play Json 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34085663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com