我有一个Scala类,它用getter和setter包装avro记录。使用Jython允许用户编写python脚本来处理Avro记录,并最终对新处理的记录执行json.dumps
问题是,如果用户想要从记录中获取一个数组值,解释器会抱怨该对象不可JSON序列化
import json
json.dumps(<AClass>.getArray('myArray'))
AClass在运行时可用于任何给定的python脚本。Scala AClass:
class AClass {
def getArray(fieldName: String): Array[Integer] = {
val value: GenericData.Array[T] = [....]
value
.asInstanceOf[GenericData.Array[T]]
.asScala
.toArray[T]
}
}
我尝试了其他几种返回类型,1)List[Integer]
,2)mutable.Buffer[Integer]
,只是普通的Avro泛型数组3)GenericData.Array[T]
。对于略有不同的对象,所有对象都会出现相同的序列化错误:
Runtime exception occurred during Python processing. TypeError: List(1, 2, 3) is not JSON serializable.
... Buffer(1, 2, 3) is not JSON serializable
... [1, 2, 3] is not JSON serializable.
现在看来,如果我们将它从python脚本中转换为list()
,它就可以正常工作了。这提供了一些线索,但需要在Scala级别实现
import json
json.dumps(list(<AClass>.getArray('myArray')))
有没有办法做到这一点?什么Scala/Java列表类型将直接转换为pythonlist
类型和/或可在Jython py解释器中进行JSON序列化
jython中的json模块只接受标准jython数据类型(这就是转换为list()的原因)。见:https://docs.python.org/3/library/json.html#py-to-json-table
相关问题 更多 >
编程相关推荐