
当通过REST API调用OML4Py嵌入式Python脚本时,若返回"errorMessage":"Output malformed JSON",通常因脚本中存在非序列化输出(如print())或返回值类型不被支持所致。本文详解错误成因、合规返回规范及修复实践。
当通过rest api调用oml4py嵌入式python脚本时,若返回`"errormessage":"output malformed json"`,通常因脚本中存在非序列化输出(如`print()`)或返回值类型不被支持所致。本文详解错误成因、合规返回规范及修复实践。
在Oracle Machine Learning for Python(OML4Py)的嵌入式Python执行环境中,REST API端点(如 /py-scripts/v1/do-eval/{scriptName})要求脚本必须返回一个严格符合JSON序列化规范的值,且禁止显式调用 print() 等产生标准输出的语句——否则会导致响应体结构破坏,触发错误码 1026 并返回 "Output malformed JSON"。
✅ 正确的返回规范
OML4Py仅接受以下类型的返回值(自动序列化为合法JSON响应):
| 类型 | 示例说明 |
|---|---|
| bool, int, float, str | 基础标量类型,直接序列化 |
| list, tuple, dict | 容器类型需确保所有嵌套元素也满足序列化要求 |
| enum / IntEnum | 枚举类需继承自标准库 enum.Enum 或 enum.IntEnum |
| pandas.DataFrame | 自动转换为JSON格式(默认 orient='records'),支持数值、字符串及布尔列;不支持含datetime、category或自定义对象的列 |
| PNG图像(隐式) | 若脚本调用绘图库(如 seaborn, matplotlib)并启用 graphicsFlag=true,则响应中会额外包含 "IMAGE" 字段(Base64编码的PNG字节),而 "DATA" 字段承载函数返回值 |
⚠️ 注意:None 作为返回值是允许的(对应JSON null),但若脚本无 return 语句,默认返回 None —— 此行为安全;而 print("hello") 会向响应流写入纯文本,直接破坏JSON结构。
❌ 常见错误示例与修复
错误写法(触发malformed JSON):
立即学习“Python免费学习笔记(深入)”;
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
# ❌ 错误:含print语句 + 返回非序列化对象
import oml
def myscript():
print("Starting analysis...") # ← 导致JSON损坏!
df = oml.sync(table="IRIS")
result = df.groupby('SPECIES').mean()
return result # pandas.DataFrame ✅,但print ❌正确写法(推荐):
# ✅ 正确:无print + 显式返回可序列化值
import oml
import pandas as pd
def myscript():
# 可选:使用logging替代print(日志不干扰响应)
# import logging; logging.info("Analysis started")
df = oml.sync(table="IRIS")
summary = df.groupby('SPECIES').agg({
'SEPAL_LENGTH': ['mean', 'std'],
'PETAL_WIDTH': 'count'
}).round(3).to_dict() # → dict ✅(比DataFrame更轻量、兼容性更强)
# 若需返回DataFrame(确保列类型纯净):
# return df[['SEPAL_LENGTH', 'SPECIES']].head(10) # str/numeric only
return summary # ✅ 安全返回dict? 调用示例(含graphicsFlag)
若需同时返回数据与图表,确保:
- 请求头启用 graphicsFlag:true
- 绘图后不调用 plt.show()(会阻塞或报错)
- 使用 plt.savefig() 到内存缓冲区(OML4Py自动捕获)
curl -i -X POST \
--header "Authorization: Bearer ${token}" \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
-d '{"graphicsFlag":true, "service":"MEDIUM"}' \
"https://your-oml-cloud/oml/api/py-scripts/v1/do-eval/myscript"响应结构示例:
{
"DATA": {"setosa": {"SEPAL_LENGTH": {"mean": 5.006, "std": 0.352}}},
"IMAGE": "/9j/4AAQSkZJRgABAQAAAQABAAD/..." // Base64-encoded PNG
}? 排查建议
- 禁用所有 print()、sys.stdout.write()、logging.basicConfig() 直接输出
- 对 pandas.DataFrame,执行 df.dtypes 检查是否含 object(可能含不可序列化值),优先用 .to_dict() 或 .astype(str) 清洗
- 使用 json.dumps(your_return_value) 在本地验证序列化可行性
- 启用 service:"DEBUG" 获取更详细错误上下文(需权限)
遵循上述规范,即可彻底规避 Output malformed JSON 错误,确保OML4Py REST API稳定、可靠地交付分析结果与可视化输出。

















