19

空または空でないリストがあります。

人間が判読でき、次のスクリプトで簡単に解析できる形式でそのリストを含む新しいファイルを作成したいと考えています。リストが空でない場合、これは正常に機能し、次のスクリプトは json ファイルを読み取ります。しかし、リストが空の場合、「ValueError: JSON オブジェクトをデコードできませんでした」というメッセージが表示されます。ファイルを開くと、実際にはコンテンツがなく、したがって JSON オブジェクトがないため、これは理にかなっています。

一部のリストが空であることは問題ありません。したがって、空の JSON オブジェクトを作成するか、リーダー スクリプトで JSON オブジェクトが見つからなくても問題ないようにする必要があります。

関連するコードは次のとおりです。

ライター スクリプト

favColor = []   OR   favColor = ['blue']   OR favColor = ['blue', 'green']
fileName = 'favoriteColor.json'
outFile = open(fileName, 'w')
json.dump(outFile, favColor)
outFile.close()

リーダー スクリプト

fileName = 'favoriteColor.json'
inFile = open(fileName, 'r')
colors = json.load(inFile)
inFile.close()

どんな助けや提案も大歓迎です。なぜ私がこれを行っているのかについてより多くの理論的根拠を提供する必要がある場合は、それも提供できます。問題を理解するために最低限必要なものから始めようと思っただけです。

4

3 に答える 3

23

リーダー スクリプトを次のように変更します。

with open('favoriteColor.json') as inFile:
    try: 
         colors = json.load(inFile)
    except ValueError: 
         colors = []

これは、ファイルを json としてロードしようとします。値のエラーが原因で失敗した場合は、json が空であることが原因であることがわかります。したがって、空のリストに色を割り当てることができます。ファイルを自動的に閉じるため、「with」構造を使用してファイルをロードすることもお勧めします。

于 2012-08-02T15:48:09.087 に答える
4

私はあなたが試みているアプローチを取りません。代わりjson.dumpに辞書を使用します。例:

d = {'var1': '123', 'var2': [1, 2, 3]}
json.dump(d, fileout)

次に、を使用dict.getしてデフォルトで適切な値にします。

json_dict = json.load(filein)
favColor = json_dict.get('favColor', [])

[]次に、表記法を使用して存在しない場合を除いて、必須の値がまだあります。

jsonパーサーの代わりに欠落値のロジックをコードに配置します...

于 2012-08-02T15:56:36.430 に答える
2

jsonファイルに変数の名前を追加することもできます。

json.dump({'favorite-color': favColor}, outFile)
outFile.close()

そして、jsonファイルを読み取るときに空のリストの場合を処理します。

data = json.load(inFile)

if len(data['favorite-color']) == 0:
    ...

保存するオブジェクトを指定してから、ファイルのようなオブジェクトをに指定する必要があることに注意してくださいjson.dump

于 2012-08-02T15:57:19.800 に答える