Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition

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 {

    public String seq2Josn(List 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

你可能感兴趣的:(Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition)