MiniZinc中String转Enum类型转换及JSON数据传入问题咨询
MiniZinc JSON输入:字符串转枚举类型及数据传递解决方案
错误原因
出现MiniZinc: type error: cannot determine coercion from type string to type tasks的核心问题:
- Record类型的字段名与JSON中的键不匹配,且字段类型声明逻辑错误
- 开放枚举与record数据的映射关系未对齐
修正后的MiniZinc代码
enum tasks; // 无需手动传入,MiniZinc会从taskDataList的长度自动推导 int : recordNumberOfTaskData = length(taskDataList); // 修正字段定义:字段名task对应JSON的key,类型为tasks枚举 type taskDataType = record(int: id, task: tasks, int: data); array[1..recordNumberOfTaskData] of taskDataType : taskDataList; solve satisfy; output ["tasks=" ++ show(tasks)++"\n"] ++ ["taskData=" ++ show(taskDataList)++"\n"]
正确的JSON输入文件
保持原结构即可,MiniZinc会自动将tasks数组初始化枚举类型,并将taskDataList中的字符串转换为枚举值:
{ "tasks": ["a1", "a2"], "taskDataList": [ {"id": 1, "task": "a1", "data": 1}, {"id": 2, "task": "a2", "data": 2} ] }
关键说明
- 字段匹配:Record的字段名必须与JSON中的键完全一致(如
task对应JSON的"task"),字段类型需指定为枚举类型tasks。 - 开放枚举初始化:
enum tasks;是开放枚举,JSON中的tasks数组会自动填充枚举值,无需在模型中硬编码。 - 自动类型转换:只要JSON中的字符串与枚举值完全匹配,MiniZinc会自动完成字符串到枚举类型的转换,无需手动编写转换逻辑。
内容的提问来源于stack exchange,提问作者qin cubism
相关产品推荐
相关产品推荐

