gpt4 book ai didi

scala - 来自周围范围的隐式参数解析

转载 作者:行者123 更新时间:2023-12-04 17:53:59 24 4
gpt4 key购买 nike

我不喜欢在我的代码中引入隐式参数,所以我想在使用它们的地方封装它们的使用。所以我试图定义一个对象,它既包含对 spray-json 的异常处理调用,又包含我的每个模型类的默认隐式 JsonFormats。然而,隐式参数不会被解析,除非它们被导入客户端,调用代码,这正是我不希望它们出现的地方。到目前为止,这是我所拥有的(它没有解决隐式格式化程序),有没有一种方法可以获得我想要的工作?

package com.rsslldnphy.json

import com.rsslldnphy.models._
import spray.json._

object Json extends DefaultJsonProtocol {

implicit val personFormat = jsonFormat1(Person)
implicit val animalFormat = jsonFormat1(Animal)

def parse[T](s:String)(implicit reader: JsonReader[T]): Option[T] = {
try { Some(JsonParser(s).convertTo[T]) }
catch { case e: DeserializationException => None }
}
}

注意。 JsonFormat 是一种 JsonReader

编辑:这是我根据@paradigmatic 的第二个建议编写的内容(我无法开始工作,我仍然得到Cannot find JsonReader or JsonFormat type class for T)。我错过了什么吗?

object Protocols extends DefaultJsonProtocol {
implicit val personFormat = jsonFormat1(Person)
implicit val animalFormat = jsonFormat1(Animal)
}

object Json {

def parse[T](s:String): Option[T] = {
import Protocols._
try { Some(JsonParser(s).convertTo[T]) }
catch { case e: DeserializationException => None }
}
}

郑重声明,这是一个确实有效的代码片段,但我试图避免它,因为它需要太多的客户端代码(即它需要在范围内具有隐式):

object Json extends DefaultJsonProtocol {
implicit val personFormat = jsonFormat1(Person)
implicit val animalFormat = jsonFormat1(Animal)
}

object ClientCode {
import Json._
def person(s: String): Person = JsonParser(s).convertTo[Person]
}

最佳答案

您可以在伴随对象中声明隐式:

object Person {
implicit val personFormat: JReader[Person] = jsonFormat1(Person)
}
object Animal {
implicit val animalFormat: JReader[Animal] = jsonFormat1(Animal)
}

隐式解析规则非常复杂。您可以在此 blog post 中找到更多信息.但是,如果编译器正在寻找类型类 T[A],它会(迟早)在类/特征 A 的伴随对象中寻找它。

编辑:如果问题只是范围“污染”的问题,您可以只引入一些大括号。在您的代码示例中,您可以调用函数解析为:

package com.rsslldnphy.json

import com.rsslldnphy.models._
import spray.json._

object Json extends DefaultJsonProtocol {
implicit val personFormat = jsonFormat1(Person)
implicit val animalFormat = jsonFormat1(Animal)

def parse[T](s:String)(implicit reader: JsonReader[T]): Option[T] = {
try { Some(JsonParser(s).convertTo[T]) }
catch { case e: DeserializationException => None }
}
}

object JsonFacade {
def optParse[T]( s: String ): Option[T] = {
import Json._
parse[T]( s )
}
}

此处的隐式仅“污染”optParse 方法。

关于scala - 来自周围范围的隐式参数解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13330808/

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