2016-11-30 6 views
0

私はPythonには新しく、既存のコードを改訂しています。jsonの文字列をリストや辞書に変更していますか?

次のようになりますPythonの関数に入ってくるJSON文字列があります:

crit=data['criteria'] 
for crit_key in crit 
    crit_val = crit[crit_key] 
    sql+ = sql+= ' and ' + crit_key + crit_val 

SQLを:

{"criteria": {"modelName":"='ALL'", "modelName": "='NEW'","fields":"*"}} 

は、今のところは、辞書は、文字列を作成するために使用されて表示されます最後の 'modelName'だけが表示されます。これは、辞書が使用されているようですが、modelNameはキーなので、2番目のmodelNameが最初に上書きされますか?私は両方のmodelNamesを含む最後の "sql"文字列をします。あなたはJSONを更新して対処する必要がないことができる場合のでOPで編集した

+0

辞書に解析する前に文字列を編集する必要があります –

+0

バグとは別に、JSONは外部から来ているのですか?これは膨大なSQLインジェクションの問題のようです。 – RemcoGerlich

+0

SQLインジェクションの問題を除いて、本当に私がする必要があると思うのはリストです。既存のコードが辞書であることを訂正しますか? – Dan

答えて

0

は、まあ

をコメントしています。

あなたが何かのようにすることができます。この例では

data = '{"criteria": {"modelName":"=\'ALL\'", "modelName": "=\'NEW\'","fields":"*"}}' 

import json 

def dict_raise_on_duplicates(ordered_pairs): 
    d = {} 
    duplicated = [] 
    for k, v in ordered_pairs: 
     if k in d: 
      if k not in duplicated: 
       duplicated.append(k) 
       d[k] = [d[k]] + [v] 
      else: 
       d[k].append(v) 
     else: 
      d[k] = v 
    return d 

print json.loads(data, object_pairs_hook=dict_raise_on_duplicates) 

を、dataは、重複キーを持つJSON文字列です。 json.loads allows duplicate keys in a dictionary, overwriting the first valueによると、重複するキーを処理するためにjson.loadを強制するだけです。

重複したキーが見つかると、現在のキーデータを含む新しいリストが作成され、新しい値が追加されます。 その後、作成されたリストにのみニュース値が追加されます。

出力:

{u'criteria': {u'fields': u'*', u'modelName': [u"='ALL'", u"='NEW'"]}} 

あなたはとにかく自分のコードを更新する必要がありますが、あなたは今それを扱うことができます。

+0

JSON形式を制御しているとします。 – RemcoGerlich

+0

また、あなたがリンクしている質問の受け入れられた回答は、それが有効であると結論づけています。 – RemcoGerlich

+0

残念ながら、私はPython関数に入ってくるJSONを制御することはできません。 – Dan

関連する問題