2017-08-09 6 views
1

でJSONを解析します。Pythonは、私は現在、PythonやFacebookのグラフAPIで働いている可能性の欠落フィールド

私はFacebookのグラフAPIから取得した情報を解析する必要がある、と私はこれを行うための最善の方法だろうかについて疑問に思いました。

確かに、

r = json.loads(request) 

はJSONを解析し、辞書を生成します。私は、ネストされた辞書にアクセスする必要がある場合に

問題が来て、例えば

ob["data"][0]["reactions"]["data"][0] 

は、そのキーが」勝ったので、私たちは、ポストは、もちろん何の反応を、持っていない場合、これは無残に失敗し、Facebookの投稿を解析していると仮定すると辞書にも存在する。私はこれらのようなことをやってしまった一時的な解決策として

if 'comments' not in dct and 'summary' not in dct and 'total_count' not in dct: 
    dct["comments"] = {"summary": {"total_count": -1}} 

は、スキーマが壊れることはないので、「デフォルト値」を作成し、エラーを取得せずに、グラフ内の任意のノードを読むことができるようにします。

あなたはどう思いますか?どのようにこれをより良くすることができますか?

EDIT:あなたはアクセスのレベルごとに安全なアクセサを使用したい

class post(DynamicDocument): 
     def __init__(self, *dct, **tmp): 
      Document.__init__(self, **tmp) 
      if dct: 
       .... 
       self.totalComentarios = dct["comments"]["summary"]["total_count"] 
+0

使用 'd.get(DESC、デフォルト値)'。おそらく、サンプルJSONを追加して、このソリューションのアプリケーションをより明確にすることができます。 – Alexander

+1

'try'ブロックにラップし、KeyError/IndexErrorをキャッチしますか? –

+0

私はこれのようなものを持っています: * POSTで編集してください* dct.get( "comments"、{} ")を持っていないと、すべてのレベルでこれを行う必要がありますこの場合、要約、および合計カウントのために、より深い場合がある –

答えて

0

。これは、1つのライナーにはできませんが、それは大丈夫です:

data = ob.get('data', []) 
entry = data[0] if len(data) else {} 
reactions = entry.get('reactions', {}) 
reaction_data = reactions.get('data', []) 
... 

あなたが各エントリを反復処理している場合entry = data[0] if len(data) ...は必要ではないかもしれないが、反復的な開発が失敗しないようにする方法のまともな例。

+0

はい]を、私はこれがあると感じつもり私にしばらく時間がかかるされて一つ一つをチェックし、より良い方法があるかどう痛みが、まあそれは、このJSONデータのような弱い型付けされたデータ構造に問題があるのです –

+0

思っていました。データが来た場合、あなたが行うことができます多くはありませんバック異なるスキーマごとに持つ。あなたが不足しているキーを処理して、簡単にそのクラスのメンバーにアクセスする方法を知っているカスタムクラスを構築することができますが、再び、あなたは各パートの安全確認をしなければなりません途中のJSONオブジェクトの – thaavik

関連する問題