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.JSONimport scala.beans.BeanPropertyobject 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)

这样看好像没什么问题,但是会报错,如下
Scala Json 和 map/ bean对象的转换 + List 转Josn字符串 "ambiguous reference to overloaded definition"
文章图片

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); }

【Scala Json 和 map/ bean对象的转换 + List 转Josn字符串 "ambiguous reference to overloaded definition"】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

    推荐阅读