2017-04-26 12 views
-1

jsonファイルから特定の値を取得してから、新しいjsonファイルを「再作成」しようとします(変換のようなもの)。以下のコードで。関数が返す結果は、結果を追加した場合変数が変更されたときに辞書の値が変更される

oldFile.json parentObj辞書内に位置するリストに、JSONにある各アイテムの辞書

  • を返す関数を定義します:私は、次のように行います

    { 
        "elements": [ 
         { 
          "fieldValues": [ 
           { 
           "id": "101", 
           "value": "John" 
           }, 
           { 
           "id": "102", 
           "value": "Doe" 
           } 
          ] 
         }, 
         { 
          "fieldValues": [ 
           { 
           "id": "101", 
           "value": "Jane" 
           }, 
           { 
           "id": "102", 
           "value": "Doe" 
           } 
          ] 
         } 
        ] 
    } 
    

    file.py

    import json 
    import os 
    
    output = {} 
    parentObj = {} 
    parentObj['entries'] = [] 
    
    def grabVals(iCounter): 
        # legend is a pre-determined dictionary matching ids with names (like first/last) 
        for myKey in subResults['elements'][iCounter]['fieldValues']: 
         if myKey['id'] in legend: 
          if 'value' in myKey: 
           newEntry = {legend[myKey['id']]: myKey['value']} 
           output.update(newEntry) # first adds 'John', then 'Doe' 
        # sample output below; next iteration would be 'Jane Doe' 
        # {"First": "John", "Last": "Doe"} 
        return output 
    
    subResults = json.loads(oldFile.json) 
    
    formCount = len(subResults['elements']) # subResults is the json above file. Grab total number of entries 
    for counter in range(0, formCount): 
        if convertTime(formEntryStamp, formEntryID) == 'keep': # self defined function (returns keep or None)  
         parentObj['entries'].append(grabVals(counter)) 
        else: 
         pass 
    
    export = json.dumps(parent_obj, indent=4, sort_keys=False) # create new json based of dictionary 
    
    f = open("finished.json", "w") 
    f.write(export) 
    f.close() 
    
    finished.json

    { 
        "entries": [ 
         { 
          "First": "John", 
          "Last": "Doe" 
         }, 
         { 
          "First": "Jane", 
          "Last": "Doe" 
         } 
        ] 
    } 
    

    実際のデータでの

    予想データ:

    { 
        "entries": [ 
         { 
          "First": "Jane", 
          "Last": "Doe" 
         }, 
         { 
          "First": "Jane", 
          "Last": "Doe" 
         } 
        ] 
    } 
    

    私の質問:どのように私は永久にparentObjに書くのですか?関数内でoutputが変更された場合、parentObjの値は新しい値で上書きされます。これには、変更可能/不変のオブジェクトを行うための何かがありますか?それ以上の明確化が必要であることをお知らせください。 (Pythonでオブジェクトの突然変異にいくつかの読み取りを行った後

  • +0

    AFAIKTが、それは常に '{「結果」:「条件文を」}返すのでええと、' grabVals(カウンタ) 'やっていることだと思います'と、それに渡される引数を使用したことがありません。..何もしないと思われる 'else:pass'とは何か... –

    +0

    つまり、サンプル入力、取得している出力、期待している出力を提供してください。* –

    +1

    ようこそStackOverflowへ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 与えられたコードをテキストファイルに貼り付けて問題を再現できるはずです。 – Prune

    答えて

    0

    関連リンクは似ていますが、私は、オブジェクト/辞書であるのに対し、リストを参照してください。リンクhere)、以下のコードは私の問題を解決しました。コメントでJuanpaが言ったのと同様に、私は私の機能(output)で再使用されていた変数を変更しました。私は以下のコードでコピーを作成し、元のままにしておくと仮定します。

    def grabVals(iCounter, output=None): 
        if output == None: 
         output = {} 
         for myKey in subResults['elements'][iCounter]['fieldValues']: 
          if myKey['id'] in legend: 
           if 'value' in myKey: 
            newEntry = {legend[myKey['id']]: myKey['value']} 
            output.update(newEntry) 
        return output 
    
    関連する問題