Python从CSV多值列构建JSON数组,实现Cisco DNAC IP池自动创建
解决CSV多值字段转JSON数组的问题
核心问题分析
CSV读取时,逗号分隔的多值字段会被识别为单个字符串,而DNAC API要求这类字段以JSON数组格式提交,所以需要在读取CSV后,对指定字段做字符串分割+去空格处理,将字符串转换为数组。
具体实现步骤(以Python为例)
假设你使用csv模块读取CSV、json模块构造请求体,修改读取逻辑如下:
1. 定义需要转数组的字段列表
先明确哪些字段需要从逗号分隔字符串转为数组:
# 指定需要转换为数组的目标字段 array_fields = ["ipv4DhcpServers", "ipv4DnsServers"]
2. 读取CSV时处理多值字段
遍历CSV每一行数据,对指定字段进行分割处理:
import csv import json # 读取CSV文件 with open("ip_pools.csv", "r") as csv_file: reader = csv.DictReader(csv_file) for row in reader: # 批量处理多值字段 for field in array_fields: if row.get(field): # 检查字段是否存在有效值 # 按逗号分割字符串,同时去除每个元素前后的空格 row[field] = [item.strip() for item in row[field].split(",")] # 构造符合DNAC要求的JSON请求体 dnac_payload = { "name": row["name"], "ipPoolCidr": row["ipPoolCidr"], "ipv4DhcpServers": row["ipv4DhcpServers"], "ipv4DnsServers": row["ipv4DnsServers"], # 单值字段直接读取使用 "gateway": row["gateway"], "netmask": row["netmask"] } # 此处可添加提交至DNAC API的代码 print(json.dumps(dnac_payload, indent=2)) # 打印验证JSON格式是否正确
3. 正确的CSV示例格式
确保CSV中多值字段仅用逗号分隔(无需额外加引号,除非值本身包含逗号):
name,ipPoolCidr,ipv4DhcpServers,ipv4DnsServers,gateway,netmask Office-Pool,192.168.1.0/24,192.168.1.10,8.8.8.8,192.168.1.1,255.255.255.0 Lab-Pool,10.0.0.0/24,10.0.0.10,10.0.0.11,10.0.0.1,255.255.255.0
关键注意事项
- 如果多值字段的元素本身包含逗号(比如带描述的内容),需用双引号包裹该字段(例如
"server1, dc1, server2, dc2"),此时csv.DictReader会自动识别为单个字符串,分割时需注意逻辑适配(但IP类字段一般不会出现这种情况)。 - 若字段为空,分割后会得到空数组,需根据DNAC API的要求决定是否保留或设为
None。
内容的提问来源于stack exchange,提问作者rbncarvalho
相关产品推荐
相关产品推荐

