使用循环将scala列表转换为json

使用循环将scala列表转换为json,json,scala,gson,Json,Scala,Gson,我尝试了很多使用while循环将scala列表转换为Json;代码如下: var json = null while (list != null) { json = new Gson().toJson(list) } 必须在循环之外访问json变量,因此我在循环之外声明了它,并用null初始化了它,但是Scala编译器给了我一个类型不匹配的异常…为什么要使用while循环将单个列表转换为json?在您解释为什么需要循环(或者更一般地说,重复转换为JSON)之前,我建议您使用以下小片

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

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

必须在循环之外访问
json
变量,因此我在循环之外声明了它,并用
null
初始化了它,但是Scala编译器给了我一个类型不匹配的异常…

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

val json = new Gson().toJson(list)
注意,我还将
var-json
更改为
val-json

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

var json = null


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

类型的变量,为什么要使用while循环将单个列表转换为json?在您解释为什么需要循环(或者更一般地说,重复转换为JSON)之前,我建议您使用以下小片段:

val json = new Gson().toJson(list)
注意,我还将
var-json
更改为
val-json

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

var json = null


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

类型的变量。此函数使用普通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 + "\""
  }
}

完整示例位于此处:

此函数适用于使用普通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 + "\""
  }
}

完整的示例位于此处:

您正在将json初始化为null,然后尝试为其分配字符串值。顺便说一句,您可能希望json是val,并执行条件初始化,而不是使用var。您正在将json初始化为null,然后尝试为其分配字符串值。顺便说一句,您可能希望json是val,并进行条件初始化,而不是使用var。它们都至少在使用Scala 2.10.2的我的计算机上。它们都至少在使用Scala 2.10.2的我的计算机上。