簡體   English   中英

Scala:在Scala中解析yaml文件(類型轉換)

[英]Scala: Parse yaml file in scala (types casting )

我有一個yaml文件,我想在scala中讀取其內容,因此我使用io.circe.yaml將其解析為json

var js = yaml.parser.parse(ymlText)
var json=js.valueOr(null)
var jsonstring=json.toString
val json2 = parse(jsonstring)

yamltext是這樣的:

ALL:
  Category1:
    Subcategory11 : 1.5
    Subcategory12 : 0
    Subcategory13 : 0
    Subcategory14  : 0.5
  Category2:
    Subcategory21 : 1.5
    Subcategory22 : 0.3
    Subcategory23 : 0
    Subcategory24  : 0

我想要的是過濾具有零值的子類別,我使用了以下代碼:

val elements = (json2 \\"ALL" ).children.map(x=>(x.values))
var subCategories=elements.map{case(a,b)=>(b)}
var cats=elements.map{case(a,b)=>(b.asInstanceOf[Map[String,Double]])}
cats.map(x=>x.filter{case(a,b)=>b>0.0})

但是最后一行給了我這個錯誤: scala.math.BigInt無法轉換為java.lang.Double

我不確定為什么要執行toString + parse以及使用了哪種parse ,但是您可能不需要它。 另外,您沒有描述您的預期結果,因此,這里有一些您可能需要的猜測:

import java.io._
import io.circe._
import io.circe.yaml._
import io.circe.parser._

def test(): Unit = {
  // test data instead of a file
  val ymlText =
    """
      |ALL:
      |  Category1:
      |    Subcategory11 : 1.5
      |    Subcategory12 : 0
      |    Subcategory13 : 0
      |    Subcategory14  : 0.5
      |  Category2:
      |    Subcategory21 : 1.5
      |    Subcategory22 : 0.3
      |    Subcategory23 : 0
      |    Subcategory24  : 0
    """.stripMargin


  var js = yaml.parser.parse(new StringReader(ymlText))
  var json: Json = js.right.get

  val categories = (json \\ "ALL").flatMap(j => j.asObject.get.values.toList)
  val subs = categories.flatMap(j => j.asObject.get.toList)
  val elements: List[(String, Double)] = subs.map { case (k, v) => (k, v.asNumber.get.toDouble) }
    .filter {
      case (k, v) => v > 0.0
    }
  println(s"elements: $elements")

  val allCategories = (json \\ "ALL").flatMap(j => j.asObject.get.toList).toMap
  val filteredTree: Map[String, Map[String, Double]] = allCategories
    .mapValues(catJson => catJson.asObject.get.toList.map { case (subName, subJson) => (subName, subJson.asNumber.get.toDouble) }
      .filter { case (subName, subValue) => subValue > 0.0 }
      .toMap)
  println(s"filteredTree : $filteredTree")
}

的輸出是:

元素:List((Subcategory11,1.5),(Subcategory14,0.5),(Subcategory21,1.5),(Subcategory22,0.3))
filteredTree:Map(類別1-> Map(子類別11-> 1.5,Subcategory14-> 0.5),Category2->地圖(Subcategory21-> 1.5,Subcategory22-> 0.3))

希望這些版本之一是您所需要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM