Scala:在scala中解析yaml文件(类型转换)

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

我有一个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

java json scala yaml
1个回答
0
投票

我不确定你为什么要使用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")
}

那个输出是:

elements:List((Subcategory11,1.5),(Subcategory14,0.5),(Subcategory21,1.5),(Subcategory22,0.3)) filteredTree:Map(Category1 - > Map(Subcategory11 - > 1.5,Subcategory14 - > 0.5),Category2 - > Map(Subcategory21 - > 1.5,Subcategory22 - > 0.3))

希望其中一个版本是您所需要的。

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