Scala Json 和 map/ bean对象的转换 + List 转Josn字符串 "ambiguous reference to overloaded definition"

用到:alibaba的fastjson
需求1:需要将一个格式是[String,MonthValue]的map转换为json,这里YearValue是自定义的case class。
MonthValue长这样,这里需要加上@BeanProperty注解,否则 fastjson解析不到。

case class MonthValue(@BeanProperty
                      light: Int,
                      @BeanProperty
                      deep: Int,
                      @BeanProperty
                      total: Int,
                      @BeanProperty
                      rem: Int)

转换时用到 val jSONObject = new JSONObject()
我需要将一个放在list里面的元素添加进这个jSONObject当中,然后把它变成一个jsonString
如下是代码

val list: List[YearRecord] = iter.toList
val jSONObject = new JSONObject()
for (elem <- list) {
  jSONObject.put(elem.month.toString,MonthValue(elem.summary_slp_lt, elem.summary_slp_dp, elem.summary_slp_dp + elem.summary_slp_lt, elem.summary_slp_rem))
}
val jstr: String = jSONObject.toJSONString

补充 这是 YearRecord list里面放的那个对象

import com.alibaba.fastjson.JSON

import scala.beans.BeanProperty

object BeanList2Json {
  def main(args: Array[String]): Unit = {
    val friend1: Friend = Friend("Sister Ma", 31, "Yoga")
    val friend2: Friend = Friend("Brother Bin", 29, "work out")
    val friend3: Friend = Friend("Big chenyu", 27, "jokes")

    val friends = List(friend1, friend2, friend3)
    val jstr: String = JSON.toJSONString(friends.toArray)
    println(jstr)
  }

}
case class Friend(@BeanProperty
                   name:String,
                 @BeanProperty
                  age:Int,
                 @BeanProperty
                  hobby:String)

这样看好像没什么问题,但是会报错,如下
在这里插入图片描述
ambiguous reference to overloaded definition:这是啥意思呢
对于重载的定义存在参数上的歧义
接着往下看
这下明白了:JSON类的这个toJSONString 方法是个重载方法,一个接收1个参数,一个接收2个参数。但是因为Scala是定义方法时可以传不定长的参数,传参比较自由,因此这里产生了歧义。
一个解决的办法时给第二个参数传个无伤大雅的值。比如下面这样:

val jstr: String = JSON.toJSONString(friends.toArray,false)
println(jstr)
//结果
[{"age":31,"hobby":"Yoga","name":"Sister Ma"},{"age":29,"hobby":"work out","name":"Brother Bin"},{"age":27,"hobby":"jokes","name":"Big chenyu"}]

第二个参数传的是什么呢?
看源码 “prettyFormat” 就是要不要按漂亮的格式,给个false就正常

public static String toJSONString(Object object, boolean prettyFormat) {
    return !prettyFormat ? toJSONString(object) : toJSONString(object, SerializerFeature.PrettyFormat);
}

true的话就这样

val jstr: String = JSON.toJSONString(friends.toArray,true)
println(jstr)
//结果
[{
 "age":31,
 "hobby":"Yoga",
 "name":"Sister Ma"
},{
 "age":29,
 "hobby":"work out",
 "name":"Brother Bin"
},{
 "age":27,
 "hobby":"jokes",
 "name":"Big chenyu"
}]

所以你要是要存储起来的话就写false,要是打印输出到控制台,可以写true

你可能感兴趣的:(积累)