Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition
问题描述
在scala当中,要将一个Seq转换成json字符串,直接使用fastjson提供的JSON.toJSONString() 方法就会报错。
示例代码:
import com.alibaba.fastjson.JSON
import scala.collection.JavaConversions.seqAsJavaList
val seq2 = Seq("a", "n")
println(JSON.toJSONString(seq))
报错信息
Error:(18, 18) ambiguous reference to overloaded definition,
both method toJSONString in object JSON of type (x$1: Any, x$2: com.alibaba.fastjson.serializer.SerializerFeature*)String
and method toJSONString in object JSON of type (x$1: Any)String
match argument types (Seq[bean.User]) and expected result type Any
println(JSON.toJSONString(seq))
从报错的信息当中我们得知是scala对对重载定义的模糊引用造成,从fastjson的源码中可以看到,有两个toJSONString的方法:
public static String toJSONString(Object object) {
return toJSONString(object, emptyFilters);
}
public static String toJSONString(Object object, SerializerFeature... features) {
return toJSONString(object, DEFAULT_GENERATE_FEATURE, features);
}
在第二个方法中SerializerFeature... features 是一个可变长参数,带有变长参数的方法重载使得scala在调用方法时感到“模糊”,就无法匹配参数的类型。
解决方案
1.在其他的博客当中有人提到用scala显式调用 JSON.toJSONString()方法,如下所示:
println(JSON.toJSONString(seq,SerializerFeature.PrettyFormat))
但是得到的结果也不是正确的
{
"empty":false,
"traversableAgain":true
}
2.创建一个java类,再其中创建一个调用JSON.toJSONString(ll)的方法,然后再由scala调用该方法即可,这样就可以避免scala的模糊调用。
import com.alibaba.fastjson.JSON;
import java.util.List;
public class Seq2Json<E> {
public String seq2Josn(List<E> ll) {
String string = JSON.toJSONString(ll);
return string;
}
}
val json = new Seq2Json[String]
println(json.seq2Josn(seq2)
结果:
["a","n"]
参考资料:
https://blog.csdn.net/universsky2015/article/details/77965590