使用 scala case class 创建一个 JSON 对象

Create a JSON object using the scala case class

我有如下所示的 JSON 文件,我的 Scala 程序必须将此 JSON 文件作为 args(0) 读取,对于 args(1) 我将通过CUSTOMER_VEHICLE 作为参数。根据传递的 args(1) 参数,程序必须获取相应的 staginDir 路径,rawLayerTbl(table name),fileDelimiter 作为三个独立的变量。

创建了一个案例 class 并尝试创建与案例 class 匹配的 JSON 对象,但运气不好,有没有使用 scala 实现此目的的简单方法。我需要在 Databricks 运行时版本 6.3(包括 Apache Spark 2.4.4、Scala 2.11)上执行此操作。

    rawSource: 
   DEALER_MASTER :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|"
   CUSTOMER_VEHICLE :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|" 
   EMPLOYEE_MASTER :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|"
   CUSTOMERCREDIT_MASTER :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|"
   CONTINUOUS_CAN_MASTER :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|" 
   LOGIN_TABLE:
    staginDir:
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter:
      - "|"  

检查下面的代码。

scala> "cat /tmp/sample.yaml".!
 rawSource:
   DEALER_MASTER :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|"
   CUSTOMER_VEHICLE :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|"
   EMPLOYEE_MASTER :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|"
   CUSTOMERCREDIT_MASTER :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|"
   CONTINUOUS_CAN_MASTER :
    staginDir :
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter :
      - "|"
   LOGIN_TABLE:
    staginDir:
      - "ADLS BLOB LOCATION"
    rawLayerTbl:
      - "TABLE_NAME"
    fileDelimiter:
      - "|"
scala> def loadYAML(path: String): String = {
     |     import com.fasterxml.jackson.databind.ObjectMapper
     |     import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
     |
     |     val yaml = scala.io.Source.fromFile(path).getLines().mkString(" \n ")
     |     val yamlReader = new ObjectMapper(new YAMLFactory)
     |     val obj = yamlReader.readValue(yaml, classOf[Any])
     |     val jsonWriter = new ObjectMapper
     |     jsonWriter.writeValueAsString(obj)
     | }
loadYAML: (path: String)String
scala> def getConfig(key: String)(yaml: String):(String,String,String) = {
     |   import org.json4s._
     |   import org.json4s.jackson.JsonMethods._
     |   implicit val formats = DefaultFormats
     |
     |   val json = parse(yaml)
     |   val staginDir = ( json \ key \ "staginDir").extract[List[String]].head
     |   val rawLayerTbl = ( json \ key \ "rawLayerTbl").extract[List[String]].head
     |   val fileDelimiter = ( json \ key \ "fileDelimiter").extract[List[String]].head
     |   (staginDir, rawLayerTbl, fileDelimiter)
     | }
getConfig: (key: String)(yaml: String)(String, String, String)
scala> val yaml = loadYAML("/tmp/sample.yaml")
yaml: String = {"rawSource":{"DEALER_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"CUSTOMER_VEHICLE":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"EMPLOYEE_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"CUSTOMERCREDIT_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"CONTINUOUS_CAN_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"LOGIN_TABLE":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]}}}

输出

scala> val (staginDir, rawLayerTbl, fileDelimiter) = getConfig("CUSTOMER_VEHICLE")(yaml)
staginDir: String = ADLS BLOB LOCATION
rawLayerTbl: String = TABLE_NAME
fileDelimiter: String = |