lift-json 3.0.1在代码片段中编译错误,将json数组转换为逗号分隔字符串

时间:2017-03-29 18:08:28

标签: json scala lift-json

我试图使用json格式的文本并将其转换为xml。我正在利用lift-json来解决这个问题。根据lift-json文档heredef toXml),我应该能够使用以下命令将json数组的元素转换为逗号分隔的字符串:

toXml(json map {
  case JField("nums",JArray(ns)) => JField("nums",JString(ns.map(_.values).mkString(",")))
  case x => x
})

所以我写了下面的代码:

case work: ActiveMQTextMessage => 
  println("work.getText: " + work.getText)
  val workAsJson: JValue = parse(work.getText)
  val processedArraysJson = workAsJson map {
    case JField(label, JArray(ns)) => JField(label, JString(ns.map(_.values).mkString(",")))
    case x => x
  }
  val workAsXml: scala.xml.NodeSeq = toXml(processedArraysJson)

但由于某种原因,它没有编译。

它报告了两个错误:

Error:(55, 14) constructor cannot be instantiated to expected type;
 found   : net.liftweb.json.JsonAST.JField
 required: net.liftweb.json.JsonAST.JValue
        case JField(label, JArray(ns)) => JField(label, JString(ns.map(_.values).mkString(",")))

Error:(55, 49) type mismatch;
 found   : net.liftweb.json.JsonAST.JField
 required: net.liftweb.json.JsonAST.JValue
        case JField(label, JArray(ns)) => JField(label, JString(ns.map(_.values).mkString(",")))

注意,我使用的lift-json版本是:

"net.liftweb" % "lift-json_2.12" % "3.0.1"

使用scala 2.12

1 个答案:

答案 0 :(得分:1)

这里的问题是Lift 3.0改变了lift-json使用map时的一些不一致性。 JField曾经是JValue,但现在不再是这种情况,因为它没有概念意义。要映射字段,您现在必须使用mapField。在上面的代码中将map更改为mapField就足够了,我也issued a PR to update the documentation

(请注意,您通常会在the Lift Google group上获得更快的答案。)