用到: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)
这样看好像没什么问题,但是会报错,如下
文章图片
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