【问题标题】:Jython - Scala array/list not JSON serializable within python scriptJython - Scala 数组/列表在 python 脚本中不是 JSON 可序列化的
【发布时间】: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]。对于略有不同的对象,都给出相同的序列化错误:

  1. Runtime exception occurred during Python processing. TypeError: List(1, 2, 3) is not JSON serializable.
  2. ... Buffer(1, 2, 3) is not JSON serializable
  3. ... [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


    【解决方案1】:

    jython 中的 json 模块只接受标准的 jython 数据类型(这就是转换为 list() 有效的原因)。见:https://docs.python.org/3/library/json.html#py-to-json-table

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多