【发布时间】:2021-05-12 22:32:11
【问题描述】:
我有一个 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 列表类型可以直接转换为 python list 类型和/或在 Jython py 解释器中可序列化为 JSON?
【问题讨论】:
标签: java python scala avro jython