2017-04-07 6 views
1

私はPythonで複雑な入れ子になったjsonを正規化しようとしていますが、すべてのオブジェクトを解析できません。Pythonで複雑な入れ子になったjsonを正規化する方法は?

私はこのページのコードを参照しています。 https://medium.com/@amirziai/flattening-json-objects-in-python-f5343c794b10

sample_object = {'Name':'John', 'Location':{'City':'Los Angeles','State':'CA'}, 'hobbies':['Music', 'Running']} 

def flatten_json(y): 
    out = {} 

    def flatten(x, name=''): 

     if type(x) is dict: 
      for a in x: 
       flatten(x[a], name + a + '_') 
     elif type(x) is list: 
      for a in x: 
       flatten(a, name) 
     else: 
      out[name[:-1]] = x 

    flatten(y) 

    return out 
flat = flatten_json(sample_object) 
print json_normalize(flat) 

返信結果

Name | Location_City | Location_State | Hobbies 
-----+---------------+----------------+-------- 
John | Los Angeles | CA    | Running 

期待される結果:

Name | Location_City | Location_State | Hobbies 
-----+---------------+----------------+-------- 
John | Los Angeles | CA    | Running 
John | Los Angeles | CA    | Music 

答えて

0

次のセクションで発信している問題

elif type(x) is list: 
    for a in x: 
     flatten(a, name) 

リストの各要素の名前を変更しないので、次の要素はすべて前の要素の割り当てを上書きし、最後の要素のみが出力に表示されます。

この例では、フラット化関数がリスト 'hobbies'に達すると、最初に 'hobbies'という名前を 'Music'要素に割り当てて出力に送信します。要素 'Music'の後には、リストの次の要素は 'Running'であり、これも "趣味"という名前になります。この要素が出力に送られると、 'hobbies'という名前がすでに存在し、 'Music'の値が 'Running'の値で上書きされます。

これを防ぐには、参照したリンクのスクリプトは次のコードを使用して配列のインデックスを名前に追加し、配列のすべての要素に一意の名前を付けます。

elif type(x) is list: 
    i = 0 
    for a in x: 
     flatten(a, name + str(i) + ' ') 
     i += 1 

これにより、新しい行ではなくデータに追加の「列」が作成されます。後者が望むものなら、機能の設定方法を変更する必要があります。 1つの方法は、jsonのリスト(元のjsonの各リスト要素の1つ)を返すように関数を適合させることです。

注記:質問を送信する際に、コードを欲張りにすることをお勧めします。インデントするのはちょっとですが、json_normalizeをインポートする部分を除外したため、パンダからインポートするすべての人が完全にはっきりしない場合があります

関連する問題