从JSON字段中分割一个字符串值并分配给YAML映射



我想将字符串拆分为多个部分,并将其分配给YAML文件中的字段。这是我的JSON文件。

{
"App Name": "blah", 
"Email": "blah@blah.com", 
"Employee ID": "xyz", 
"Load Balancing Method": "Round Robin", 
"Network": "CMN", 
"Pool Member": "pucq-spn-198 5001/tcprnpucq-spn-199 5002/tcprnpucq-spn-200 
5003/tcp", 
"Pool Monitor": "tcp", 
"Pool name": "pool", 
"SSL": "Required", 
"VIP Name": "vs-ng"
}

这是用户从web表单提交的输入,我通过API访问它。我想将Pool Member字段中的值拆分为单独的字符串,如pucq-spn-1985001pucq-spn-1995002,并将这些值分配给YAML文件中的不同字段。这是我的YAML文件。

nodes:
- description: PU
host: 10.10.10.10
monitors:
- /Common/icmp
name: node
- description: PU
host: 10.10.10.10
monitors:
- /Common/icmp
name: node-puex
partition: Common
pool:
descriptions: PUE
lb_method: Round Robin
monitors:
- /Common/tcp
name: pool
pool_members:
- node_name: **pucq-spn-198**
port: **5001**
- node_name: **pucq-spn-199**
port: **5002**
server: gmly-p-01.blah.com
virtual_server:
destination: 1.1.1.1
ip_protocol: udp
name: vs-ng
pool: pool-pu-ind
port: 999
profiles:
- name: fastL4
type: performance-l4

我想把-node_name:port中的值放在pool_members:下。到目前为止,我试过这样的东西。但它不起作用。

import json
import requests
import yaml
url = "http://127.0.0.1:5000/vip7.json"
r = requests.get(url)
json_file = json.loads(r.content)
j = json_file
with open('C:/pytest/vs-test.yml', 'r') as f:
y = yaml.load(f)
# Assign JSON values to YAML
y['pool']['lb_method'] = j['Load Balancing Method']
y['pool']['name'] = j['Pool name']
y['virtual_server']['name'] = j['VIP Name']
y['pool_members']['node_name'] = j[0]['Pool Member']
print (y['pool_members']['node_name'])

什么都不做。

也尝试过分裂。它打印出零件pucq-spn-198

pool = j['Pool Member']
p = pool.split()
y['pool_members']['node_name'] = pool[0:12]
print (pool[0:12])

但当我像这样分配y['pool_members']['node_name'] = pool[0:12]时,它不起作用。

我不确定你要强调的确切问题,但

  1. y['pool_members'] = pool_members本应导致某些

  2. 当您在输出中只想要3个元素,并且在拆分给定的成员字符串值后只有6元素时,我认为[0:12]是不正确的。

如果您想对值对进行迭代,一种方法是生成生成器函数。

你应该做什么的完整例子如下:

import json
import yaml 
from pprint import pprint
# defining the input data 
data = {
"App Name": "blah", 
"Email": "blah@blah.com", 
"Employee ID": "xyz", 
"Load Balancing Method": "Round Robin", 
"Network": "CMN", 
"Pool Member": "pucq-spn-198 5001/tcprnpucq-spn-199 5002/tcprnpucq-spn-200 5003/tcp", 
"Pool Monitor": "tcp", 
"Pool name": "pool", 
"SSL": "Required", 
"VIP Name": "vs-ng"
}
# Parse the input data and make sure there are even names and ports after a split
pool_members = data['Pool Member'].split()
amt = len(pool_members)
if amt % 2 != 0:
raise Exception("Not all pool members have a name and port!")
# create a lazy iterator over the list
gen = (pm for pm in pool_members)
# Creates a list of key-value pairs 
pool_members = [{"node_name": next(gen), "port" : next(gen)} for _ in range(amt // 2)]
# Generating the YAML
'''
loading a yaml file just makes a dict, so pretend there 
was previously any pool members before, or an empty list
'''
yaml_data = {"pool_members": []}
print(3 * "-")
yaml_data["pool_members"] = pool_members
# TODO: Write YAML to file instead of console
print(yaml.dump(yaml_data, default_flow_style=False))

这会输出以下内容:

---
pool_members:
- node_name: pucq-spn-198
port: 5001/tcp
- node_name: pucq-spn-199
port: 5002/tcp
- node_name: pucq-spn-200
port: 5003/tcp

最新更新