これは、既存のファイルを使用してPythonでJSONオブジェクトをリバースエンジニアリングすることです。ファイルの内容は以下の通りである:Pythonの特定のJSONに準拠するJSONオブジェクトを作成します。
[
{
"id": "PA_vnf",
"name": "PA",
"short-name": "PA",
"description": "A firewall PaloAlto",
"version": "1.0",
"connection-point": [
{
"type": "VPORT",
"name": "PA/cp0"
},
{
"type": "VPORT",
"name": "PA/cp1"
},
{
"type": "VPORT",
"name": "PA/cp2"
}
],
"vdu": [
{
"id": "pa_vdu",
"external-interface": [
{
"virtual-interface": {
"type": "VIRTIO"
},
"vnfd-connection-point-ref": "PA/cp0",
"name": "eth0"
},
{
"virtual-interface": {
"type": "VIRTIO"
},
"vnfd-connection-point-ref": "PA/cp1",
"name": "eth1"
},
{
"virtual-interface": {
"type": "VIRTIO"
},
"vnfd-connection-point-ref": "PA/cp2",
"name": "eth2"
}
],
"guest-epa": {
"cpu-pinning-policy": "ANY"
},
"name": "vdu-1",
"vm-flavor": {
"storage-gb": 40,
"memory-mb": 4096,
"vcpu-count": 4
},
"image": "paloAlto_RIP"
}
],
"service-function-chain": "UNAWARE",
"meta": "important info"
}
]
はちょうど今、私はすべてのキーの値をハードコーディングしていますため、物事を単純化するために、サンプルコードは以下の通りです:については
def create_vnf_new():
ginfo = nested_dict(5,list)
ginfo['description'] = 'A firewall PaloAlto'
ginfo['name'] = 'PA'
ginfo['id']= 'PA_vnf'
ginfo['version'] = '1.0'
ginfo['service-function-chain'] = 'UNAWARE'
ginfo['short-name'] = 'PA'
ginfo['vdu']['id'] = 'pa_vdu'
ginfo['vdu']['name'] = 'vdu-1'
ginfo['vdu']['image'] = 'paloAlto_RIP'
ginfo['vdu']['guest-epa']['cpu-pinning-policy'] = 'ANY'
ginfo['vdu']['external-interface']['virtual-interface']['type'] = 'VIRTIO'
ginfo['vdu']['external-interface']['vnfd-connection-point-ref'] = "PA/cp0"
ginfo['vdu']['external-interface']['name'] = 'eth0'
ginfo['vdu']['vm-flavor']['storage-gb'] = 20
ginfo['vdu']['vm-flavor']['memory-mb'] = 1024
ginfo['vdu']['vm-flavor']['vcpu-count'] = 4
print(json.dumps(ginfo))
def nested_dict(n, type):
if n == 1:
return defaultdict(type)
else:
return defaultdict(lambda: nested_dict(n-1, type))
I O/Pの下に取得する:
{
"short-name": "PA",
"vdu": {
"name": "vdu-1",
"image": "paloAlto_RIP",
"id": "pa_vdu",
"external-interface": {
"virtual-interface": {
"type": "VIRTIO"
},
"vnfd-connection-point-ref": "PA/cp0",
"name": "eth0"
},
"guest-epa": {
"cpu-pinning-policy": "ANY"
},
"vm-flavor": {
"storage-gb": 20,
"vcpu-count": 4,
"memory-mb": 1024
}
},
"description": "A firewall PaloAlto",
"version": "1.0",
"service-function-chain": "UNAWARE",
"id": "PA_vnf",
"name": "PA"
}
上記のO/Pは完全に罰金ですが、私は「外部インタフェース」のような特定の属性は、私が行うことができないのです複数の値を持つようにしたいです。私は辞書のメソッドを追加しようとしましたが、エラー"'collections.defaultdict'オブジェクトには属性 'append'"がありません。 例:ginfo ['vdu'] ['external-interface'] ['vnfd-connection-point-ref']追加( "値")
何が問題になるのかよく分かりません。また、私はo/pには欠けている出力の最初の大括弧をどのように取得するのですか?私はそれが配列でなければならないことを知っているが、私はどのように私の辞書オブジェクトに配列のロジックを適用するか分からない。
説明が不明確な場合は、約5時間運んでからこのヘルプを入力しているのでお知らせください。