设计scala库需要避免反射吗?
Do we need to avoid reflection when design scala libraries?
以argonaut
为例,在我们的一些项目中,当需要处理JSON时,人们会为此使用argonaut,并对字段进行硬编码,例如:
implicit def AddressCodecJson: CodecJson[Address] =
casecodec3(Address.apply, Address.unapply)("street", "number", "post_code")
如果有大caseclass,列表会很长:
implicit def AddressCodecJson: CodecJson[Address] =
casecodec12(Address.apply, Address.unapply)("street", "number", "post_code", "...", "...", "...", "...", "...", "...", "...", "...", "...")
我的问题是为什么我们需要对它们进行硬编码,而不是通过反射获取字段?
有什么技术问题,或者人们在设计 Scala 库时不喜欢使用反射?
我不是很清楚您是否在尝试一般地解析 json。我假设您想一般地解析任何 json。
如果是这种情况,您可以使用 json4s
来代替为每个 classes 创建隐式转换。在这种情况下,您不需要为每个 class 提供隐式转换。我们在我们的项目中广泛使用它。
您只需要为每种类型提供隐式转换器(例如:如何转换 java.sql.timestamp、java.sql.Date、Joda-Time 等)。
这个 link 可能会对您有所帮助。
以argonaut
为例,在我们的一些项目中,当需要处理JSON时,人们会为此使用argonaut,并对字段进行硬编码,例如:
implicit def AddressCodecJson: CodecJson[Address] =
casecodec3(Address.apply, Address.unapply)("street", "number", "post_code")
如果有大caseclass,列表会很长:
implicit def AddressCodecJson: CodecJson[Address] =
casecodec12(Address.apply, Address.unapply)("street", "number", "post_code", "...", "...", "...", "...", "...", "...", "...", "...", "...")
我的问题是为什么我们需要对它们进行硬编码,而不是通过反射获取字段?
有什么技术问题,或者人们在设计 Scala 库时不喜欢使用反射?
我不是很清楚您是否在尝试一般地解析 json。我假设您想一般地解析任何 json。
如果是这种情况,您可以使用 json4s
来代替为每个 classes 创建隐式转换。在这种情况下,您不需要为每个 class 提供隐式转换。我们在我们的项目中广泛使用它。
您只需要为每种类型提供隐式转换器(例如:如何转换 java.sql.timestamp、java.sql.Date、Joda-Time 等)。
这个 link 可能会对您有所帮助。