Разделить строковое значение из поля JSON и назначить карте YAML - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу разбить строку на различные части и назначить ее полям в файле 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/tcp\r\npucq-spn-199 5002/tcp\r\npucq-spn-200 
  5003/tcp", 
 "Pool Monitor": "tcp", 
 "Pool name": "pool", 
 "SSL": "Required", 
 "VIP Name": "vs-ng"
}

Это пользовательский ввод данных из веб-формы, я получаю к нему доступ через API.Я хочу разделить значения из поля Pool Member на отдельные строки, например pucq-spn-198 5001 pucq-spn-199 5002, и назначить их различным полям в файле 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 Ответ

0 голосов
/ 03 декабря 2018

Я не уверен, какую именно проблему вы пытаетесь выделить, но

  1. y['pool_members'] = pool_members должно было привести к что-то .

  2. Я не думаю, что [0:12] является правильным, если вы хотите, чтобы на выходе были только 3 элементы, и есть только * 6 элементов после разбиения заданного элемента строковым значением.

Если вы хотите выполнить итерацию по парам значений, одним из способов будет создание функции генератора.

Полный пример того, что вы должны делать:видел здесь:

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/tcp\r\npucq-spn-199 5002/tcp\r\npucq-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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...