如何将Scala中的类型类转换为代数数据类型?

问题描述 投票:1回答:1

目前我有两个类,如何将它们转换为代数数据类型?我想我可以做类似case class BlacklistDynamoDBUpdate(ruleName: String, whitelistedAccount, featureName: String)的事情,但是如何在该类中使用这些方法?

class DynamoDBUpdateBlacklist {
  private var features: Array[BlacklistDynamoDBUpdate] = _

  def getFeatures = features

  def setFeatures(features: Array[BlacklistDynamoDBUpdate]) = {
    this.features = features
  }
}
class BlacklistDynamoDBUpdate {
  private var ruleName: String = _
  private var whitelistedAccount: String = _
  private var featureName: String = _

  def getFeatureName: String = featureName

  def setFeatureName(featureName: String) = {
    this.featureName = featureName
  }

  def getRuleName: String = ruleName

  def setRuleName(ruleName: String) = {
    this.ruleName = ruleName
  }

  def getWhitelistedAccounts: String = whitelistedAccount

  def setWhitelistedAccounts(whitelistedAccount: String): Unit = {
    this.whitelistedAccount = whitelistedAccount
  }
}

我将json转移到scala对象中,json看起来像这样

"features": [ { "featureName": "***", "ruleName": "***", "whitelistedAccounts": "***" }], 

我想要的是获取那些属性值

scala
1个回答
0
投票

[如果您需要将json解析为惯用的scala代码,请使用简单的案例类和库,该案例和库旨在将此类json直接解析为这些案例类(我个人认为这是https://lihaoyi.com/upickle或这https://circe.github.io/circe)。

这里是示例代码,显示了如何使用upickle。

import upickle.default.{ReadWriter => RW, macroRW}

case class DynamoDBUpdateBlacklist(features:Seq[BlacklistDynamoDBUpdate])
case class BlacklistDynamoDBUpdate(featureName:String, ruleName:String, whitelistedAccounts:String)

object DynamoDBUpdateBlacklist {
  implicit val rw: RW[DynamoDBUpdateBlacklist] = macroRW
}
object BlacklistDynamoDBUpdate {
  implicit val rw: RW[BlacklistDynamoDBUpdate] = macroRW
}

//use it like that
import upickle.default._
println(
  read[DynamoDBUpdateBlacklist]("""
    {"features":[{ "featureName": "***", "ruleName": "***", "whitelistedAccounts": "***" }]}
  """)
)

//DynamoDBUpdateBlacklist(Vector(BlacklistDynamoDBUpdate(***,***,***)))

https://scalafiddle.io/sf/8eqFEfX/1

© www.soinside.com 2019 - 2024. All rights reserved.