通过Python向自定义字段插入动态验收标准时出现内部服务器错误的问题排查
问题排查与解决方案
你的核心问题出在手动拼接JSON字符串时产生了多处语法错误,导致Jira API无法解析,返回模糊的内部服务器错误。我们一步步拆解问题并给出修复方案:
1. 手动拼接JSON的致命错误
先看你生成的strAcc内容,有几个明显的格式问题:
- 多余的嵌套大括号:你生成的结构是
[{ {..."}, {..."}, }],正确的数组结构应该直接包含对象:[{...}, {...}, {...}] - 字符串未加引号:比如
"name":Create Testcases里的Create Testcases没有被双引号包裹,这是无效的JSON键值对 - 对象末尾多余逗号:最后一个对象后面的逗号(
,})会导致JSON解析失败 - 布尔值类型不匹配:如果
entry["MANDATORY"]是数据库返回的字符串"True"/"False",直接拼接会保留字符串类型,而非JSON要求的布尔值(虽然Jira可能兼容,但这是不规范的写法)
2. 正确的实现方式:用Python数据结构+JSON序列化
永远不要手动拼接JSON字符串,Python的json模块可以帮你完美处理格式问题,同时Jira Python库支持直接传递Python数据结构(会自动完成序列化)。
修正后的代码示例
import json # 1. 从数据库加载数据后,构建Python列表(而非拼接字符串) acc_list = [] cnt_id = 1 cnt_rank = 0 for entry in accDict: # 处理MANDATORY字段:如果是字符串则转为布尔值 is_mandatory = entry["MANDATORY"] == "True" if isinstance(entry["MANDATORY"], str) else entry["MANDATORY"] acc_item = { "name": entry["NAME"], "checked": False, "Mandatory": is_mandatory, "option": False, "id": cnt_id, "rank": cnt_rank } acc_list.append(acc_item) cnt_id += 1 cnt_rank += 1 # 2. 更新Jira问题:直接传递Python列表(Jira库会自动处理JSON序列化) try: new_issue.update(fields={"customfield_11100": acc_list}) print("验收标准更新成功!") except Exception as e: print(f"更新失败:{str(e)}")
为什么手动拼接会失败?
你手动生成的字符串是无效JSON,Jira API解析时触发错误但只返回了模糊的"Internal server error";而你手动编写的字符串是正确的JSON格式,所以能正常运行——本质是手动拼接时犯了格式错误,手动编写时恰好避免了这些问题。
3. 额外注意事项
- 确认
customfield_11100的字段类型:如果该字段要求传递JSON字符串而非Python列表,可改用json.dumps(acc_list)生成标准JSON字符串后传递 - 用
print(json.dumps(acc_list, indent=2))打印出生成的JSON,和你手动编写的正确版本对比,确保格式完全一致 - 检查数据库返回的字段值类型,避免字符串和布尔值、数字类型混淆
内容的提问来源于stack exchange,提问作者Hauerli
相关产品推荐
相关产品推荐

