私はPython(v3.5)で複雑なMongoDBドキュメントを取得しています。オブジェクト内に散在していて、構造内に特定のパターンがなく、別のMongoDBコレクションに戻ります。オブジェクトは、次のようになります。Pythonで複雑なJSONオブジェクトを更新する
# after json.loads(mongo_db_document) my dict looks like this
notification = {
'_id': '570f934f45213b0d14b1256f',
'key': 'receipt',
'label': 'Delivery Receipt',
'version': '0.0.1',
'active': True,
'children': [
{
'key': 'started',
'label': 'Started',
'children': [
'date',
'time',
'offset'
]
},
{
'key': 'stop',
'label': 'Ended',
'children': [
'date',
'time',
'offset'
]
},
{
'label': '1. Particulars',
'template': 'formGroup',
'children': [
{
'children': [
{
'key': 'name',
'label': '2.1 Name',
'value': '********** THIS SHOULD BE UPDATED **********',
'readonly': 'true'
},
{
'key': 'ims_id',
'label': '2.2 IMS Number',
'value': '********** THIS SHOULD BE UPDATED **********',
'readonly': 'true'
}
]
},
{
'children': [
{
'key': 'type',
'readonly': '********** THIS SHOULD BE UPDATED **********',
'label': '2.3 Type',
'options': [
{
'label': 'Passenger',
'value': 'A37'
},
{
'label': 'Cargo',
'value': 'A35'
},
{
'label': 'Other',
'value': '********** THIS SHOULD BE UPDATED **********'
}
]
}
]
}
]
},
{
'template': 'formGroup',
'key': 'waste',
'label': '3. Waste',
'children': [
{
'label': 'Waste',
'children': [
{
'label': 'Plastics',
'key': 'A',
'inputType': 'number',
'inputAttributes': {
'min': 0
},
'value': '********** THIS SHOULD BE UPDATED **********'
},
{
'label': 'B. Oil',
'key': 'B',
'inputType': 'number',
'inputAttributes': {
'min': 0
},
'value': '********** THIS SHOULD BE UPDATED **********'
},
{
'label': 'C. Operational',
'key': 'C',
'inputType': 'number',
'inputAttributes': {
'min': 0
},
'value': '********** THIS SHOULD BE UPDATED **********'
}
]
}
]
},
{
'template': 'formRow',
'children': [
'empty',
'signature'
]
}
],
'filter': {
'timestamp_of_record': [
'date',
'time',
'offset'
]
}
}
私の最初のアイデアは、私は値を更新する必要がある場所で($var_name
のような)プレースホルダを入れて、Pythonのstring.Template
で文字列をロードするためだったが、そのアプローチは、残念ながらに原料の多くを破ります何らかの理由で同じMongoDB文書の他のユーザ。
私は更新する必要がある値を見つけるために "ハードコーディング"パスなしでこの種のオブジェクトを単純に変更するソリューションがありますか?
これらの値のパスを動的に見つける方法を尋ねていますか? – C14L
何らかの理由でjsonとして再度ロード、変更、保存することはできません。 – Roberto
@ C14Lまあ、そうですね、あなたは私の質問をそのように公式化することができます:)私はすべてのdictを通ってそれぞれの可能性を探す関数を書くことができますが、 – errata