IBM Watson Cloud上Docplex决策优化输出JSON乱码问题求助
在IBM Watson Cloud中Docplex生成JSON输出乱码的解决方案
问题分析
本地运行正常但云端生成JSON乱码,核心原因是云端环境的输出流处理逻辑与本地存在差异,且你的JSON写入代码未对齐原有CSV代码的Python版本兼容处理,导致编码写入方式不匹配。
解决方案
根据你的输出内容类型,分两种情况调整write_all_outputs函数:
场景1:输出内容为可序列化Python对象(字典/列表等)
修改函数以对齐原有CSV的版本兼容逻辑,同时确保JSON序列化时保留UTF-8字符:
import json import sys from six import iteritems from docplex.util.environment import get_environment def write_all_outputs(outputs): for (name, content) in iteritems(outputs): json_file = '%s.json' % name print(json_file) with get_environment().get_output_stream(json_file) as fp: # 序列化时禁用ASCII转义,保留原字符 json_content = json.dumps({name: content}, ensure_ascii=False, indent=2) if sys.version_info[0] < 3: # Python 2环境下直接写入编码后的字节流 fp.write(json_content.encode('utf-8')) else: # 对齐CSV处理逻辑,编码后写入(适配云端流模式) fp.write(json_content.encode('utf-8')) if len(outputs) == 0: print("Warning: no outputs written")
场景2:输出内容为Pandas DataFrame(与原有CSV场景一致)
如果outputs中的值是DataFrame,直接用json.dumps序列化会导致结构异常,需改用DataFrame自带的to_json方法:
import json import sys import pandas as pd from six import iteritems from docplex.util.environment import get_environment def write_all_outputs(outputs): for (name, df) in iteritems(outputs): json_file = '%s.json' % name print(json_file) with get_environment().get_output_stream(json_file) as fp: # 将DataFrame转为JSON字符串,指定格式和编码 json_content = df.to_json(orient='records', ensure_ascii=False, indent=2) if sys.version_info[0] < 3: fp.write(json_content.encode('utf-8')) else: fp.write(json_content.encode('utf-8')) if len(outputs) == 0: print("Warning: no outputs written")
关键调整点
- 添加
ensure_ascii=False:避免非ASCII字符被转义为Unicode编码(如\uXXXX),确保输出的JSON可读性正常。 - 对齐Python版本处理逻辑:严格遵循原有CSV代码的版本分支,保证云端Python2/Python3环境下的写入兼容性。
- DataFrame特殊处理:若输出是DataFrame,必须使用
df.to_json而非直接json.dumps,否则会生成非预期的JSON结构。
部署配置验证
确保部署中的OUTPUT_DATA配置正确匹配JSON后缀:
solve_payload = { client.deployments.DecisionOptimizationMetaNames.OUTPUT_DATA: [ { "id" : ".*\\.json" } ] }
(注:双反斜杠是Python字符串的转义要求,确保正则表达式能正确匹配.json后缀)
内容的提问来源于stack exchange,提问作者Yasmine
相关产品推荐
相关产品推荐

