2012-08-02 5 views
11

私はリストを持っていますが、リストは空でも空でもないかもしれません。リストが空であってもjsonオブジェクトにダンプを強制する

人間が読める形式でそのリストを含む新しいファイルを作成し、次のスクリプトが解析しやすいようにしたいとします。リストが空でない場合、これは正常に動作し、次のスクリプトはjsonファイルを読み込みます。しかし、リストが空の場合、ValueError:JSONオブジェクトをデコードできません。これは意味があります。ファイルを開くと、実際にはコンテンツが存在せず、したがってJSONオブジェクトが存在しないからです。

いくつかのリストが空であることは間違いありません。だから、私は空のJSONオブジェクトを書きたいのですが、JSONオブジェクトが見つからないので読者スクリプトをOKにしておきたいです。

ライタースクリプト

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() 

すべてのヘルプや提案は大歓迎:

はここに関連するコードです。なぜ私がこれをやっているのかについてもっと論理的根拠を提供する必要があるならば、私はそれを提供することもできます。問題を理解するのに必要な最低限のものから始めたいと思っていました。

答えて

15

はこれにあなたの読者のスクリプトを変更します。

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

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

+0

ニースとクレンジング+1 –

+0

「open()as ...」が推奨されている理由をよく了解いただきありがとうございます。私は人々がそれが以前より好まれていると言うことを聞いたことがありますが、理由がなければそれは決して私に変わることはありません。 – rcorty

2

私はあなたが試みているアプローチを取っていません。私は希望代わり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.dump({'favorite-color': favColor}, outFile) 
outFile.close() 

、ケースを扱う:

あなたはまた、あなたのJSONファイル内の変数の名前を追加することができます

2

...不足しているあなたのコード内の値の代わりに、JSONパーサーのロジックを置きますあなたが保存してjson.dumpへのファイルのようなオブジェクトにしたいオブジェクトを提供しなければなりません

data = json.load(inFile) 

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

注:JSONファイルを読み込む空のリストの。

関連する問題