2016-12-26 11 views
0

jsonファイルがekstraブラケットを取得する理由がわかりません。Jsonファイルの更新または編集時にJsonフォーマットの問題が発生する

これは私のproducts.jsonファイルです。右端にブラケットが2つ多くあります。

{"products": {"27": {"price": 5, "pk": 27, "name": "gfasd", "amount": 3, "type": "sokker", "imageURL": "/media/gg_6A1aZ75.jpg"}}}}} 

モデルインスタンスが保存されるたびに、post_save関数を使用してjsonファイルを更新します。

@receiver(post_save, sender=item, dispatch_uid="update_json") 
def update_stock(sender, instance, **kwargs): 
    pk = str(instance.pk) 
    with open(MEDIA_ROOT + '/json/products.json', 'r+') as json_file: 
     products = json.loads(json_file.read()) 
     print(products) <--- 1 
     products["products"].pop(pk, None) 
     print(products) <--- 2 
     products["products"][pk] = instance.returnAsJSON() 
     print(products) <--- 3 
     json_file.seek(0) 
     json_file.write(json.dumps(products)) 

プリントアウトは次のとおりです。

{'products': {'27': {'price': 123, 'type': 'sokker', 'name': 'gfasd', 'amount': 3, 'pk': 27, 'imageURL': '/media/gg_6A1aZ75.jpg'}}} 
{'products': {}} 
{'products': {'27': {'price': 5, 'pk': 27, 'name': 'gfasd', 'amount': 3, 'type': 'sokker', 'imageURL': '/media/gg_6A1aZ75.jpg'}}} 

最後の印刷が2つのekstraブラケットを持っていないので、私はそれが私の関数の最後の2行かもしれ推測しています。しかし、私は彼らがなぜそれをするのか本当に知りません。

+0

多分あなたは、既存のファイル内のテキストを上書きし、それが前のテキストを削除しないと、あなたが古いブラケット見る - 'r'だけ' w'を書くことが、後にオープンを読み取ることのみより良いオープンを。 – furas

+0

あなたの問題を解決した場合、正しい答えとしてマークすることを忘れないでください* –

答えて

1

問題は、おそらくファイルを保存する方法に関連しています。 json_file.seek(0)の後にjson_file.truncate()を追加する必要があります。新しいものを保存する前に、ファイルの内容を消去します。

-

あなたが0の位置を求めた場合、あなただけのカーソルを変更するが、ファイルの内容は同じになりますので、ファイルに何か大きなものがあった場合、それはそこに滞在します。
例:

products.json

{"foo":"bar"} 

with open("products.json", "r+") as json_file: 
    json_file.seek(0) 
    json_file.write(json.dumps({"foo":"b"})) # Will write {"foo":"b"} to the file 

の代わり{"foo":"b"}でファイルをその結果、products.jsonファイルの内容は{"foo":"b"}"}

1

UPDATE次のようになります。ファイルを読み込み内容を更新し、ファイルの内容を置き換えるために、あなたが意図している表示されます更新された構造を使用します。それで、私は、あなたのコードに明示的に2つの変更を加えました。明示的にファイルを開き、データを読み込み、ファイルを閉じ、最後にファイルを開いて新しい構造体を入れ、ファイル。これにより、ファイル自体が毎回きれいになるようにする必要があります。


あなたはそれを検討するかもしれない:

products["products"][pk] = instance.returnAsJSON() 

は、JSONのリターンの一部として余分な括弧を追加することができます。

また、むしろ使用より:

products = json.loads(json_file.read()) 
    json_file.write(json.dumps(products)) 

使用してみてください:

  json_file.seek(0) 
:私も削除した

@receiver(post_save, sender=item, dispatch_uid="update_json") 
def update_stock(sender, instance, **kwargs): 
    pk = str(instance.pk) 
    with open(MEDIA_ROOT + '/json/products.json', 'r') as json_input_file: 
     products = json.load(json_file); json_input_file.closed 
    print(products) <--- 1 
    products["products"].pop(pk, None) 
    print(products) <--- 2 
    products["products"][pk] = instance.returnAsJSON() 
    print(products) <--- 3 
    with open(MEDIA_ROOT + '/json/products.json', 'w') as json_output_file: 
     json.dump(products, json_output_file); json_output_file.closed 

注:

products = json.load(json_file) 
    json.dump(products, json_file) 

のように

私はここにその必要性を見ない。疲れた目に何かが見当たらない場合は、無視して、おそらく私に知らせてください。

これらのきれいなものが少し見つかります。

関連する問題