【问题标题】:Convert scala list to json using loop使用循环将scala列表转换为json
【发布时间】:2013-09-21 05:11:10
【问题描述】:

我尝试使用 while 循环将我的 scala 列表转换为 Json;代码如下:

 var json = null
 while (list != null) {
   json = new Gson().toJson(list)
 }

json 变量必须在循环外访问,所以我在循环外声明它并使用null 进行初始化,但是 Scala 编译器给了我一个类型不匹配异常...

【问题讨论】:

  • 您正在将 json 初始化为 null,然后尝试为其分配一个字符串值。顺便说一句,您可能希望 json 成为 val 并进行条件初始化,而不是使用 var。

标签: json scala gson


【解决方案1】:

为什么要使用 while 循环将单个列表转换为 JSON?在您解释为什么需要循环(或者,更一般地说,重复转换为 JSON)之前,我建议您使用以下简单的 sn-p:

val json = new Gson().toJson(list)

请注意,我还将var json 更改为val json

但是,如果您只想知道如何摆脱类型不匹配异常,只需更改:

var json = null

var json: String = null

var json: String = _

如果你不将json 声明为String 类型,Scala 将隐含地将其视为(即推断)Null 类型,并且不可能将String 类型的值分配给Null 类型的变量。

【讨论】:

  • 他们都绝对至少在我的计算机上使用 Scala 2.10.2。
【解决方案2】:

这个函数适用于 List 和 Map 都使用普通的 Scala 结构:

def toJson(a: Any): String = {
  a match {
    // number
    case m: Number => m.toString
    // string
    case m: String => "\"" + m + "\""
    case m: Map[AnyRef, AnyRef] => {
"{" + (m map { x => val key = x._1; toJson(key) + ": " + toJson(m(key)) } mkString (", ")) + "}"
}

    case l: Seq[AnyRef] => { "[" + (l map (toJson(_)) mkString (",")) + "]" }

    // for anything else: tuple
    case m: Product => toJson(m.productIterator.toList)
    case m: AnyRef => "\"" + m.toString + "\""
  }
}

完整示例位于此处:https://gist.github.com/tuxdna/7926531

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 2020-04-27
    • 2013-03-08
    • 2018-07-05
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多