2017-08-04 40 views
-1

这个问题可能已经被问了很多次了,但我仍然无法理解如何使用json文件。我使用json.dump(data, filename)。在倾销期间,我在文件结尾处获得了不必要的{}。所以json.load(数据)给我下面的错误。json dump生成不必要的大括号

simplejson.scanner.JSONDecodeError: Extra data: line 1 column 1865 - line 1 column 1867 (char 1864 - 1866) 

我看到没有办法加载第一个或第二个字典。我也读过,有一个可以用于JSON转储的分离器,但我在这里看不到用处。我应该在这里使用编码,解码吗?

我那样json.dump文件:

{ 
    "deployCI2": ["094fd196-20f0-4e8d-b946-f74a56d2f319", "6a1ce382-98c6-4058-a929-95a7d2415fd0"], 
    "deployCI3": ["c8fff661-4482-4908-b722-4fac0227a8b0", "929cf1fa-3fa6-4f95-8464-d58e5490f4cf"], 
    "deployCI4": ["9f8ffa3c-460d-43a9-8113-58e891340e1b", "6e535e92-4da2-4228-a6ab-c8fc8d31adcd", "8e26a35e-7fb9-43b3-8026-d1283f7b678c", "f40e5c29-b4df-4cfb-9d7f-3bcc9c4dcf9f"], 
    "HeenaStackABC": [], "HeenaStackABC-DISK_VM1-mm55lkkvccej": ["cc2a89a2-3b27-4f88-af09-b3b0b1301056"] 
    }{} 

编辑:我觉得代码是在这里做什么。

with open('stackList.json', 'a') as f: 
    for stack in stacks: 
     try: 
      hlist = hc.resources.list(stack_id=stack.id) 
      vlist = [o.physical_resource_id for o in hlist if o.resource_type =='OS::Cinder::Volume'] 
      myDict[stack.stack_name] = vlist 
     except heatclient.exc.HTTPBadRequest as e: 
      pass 
    json.dump(myDict,f) 

我编辑了下面的代码。我希望这是有效的。它去掉了最后括号

if len(myDict) != 0: 
     json.dump(myDict, f) 
+0

实际上,像'json'这样的主要python stdlib包被破坏以至于它生成无效的json的几率非常低。 _请发布最低限度的必要代码来重现问题_(很可能您会在自己的代码中找到错误并自行找到错误)。 –

+0

请检查我编辑的问题 –

+0

“重现问题所需的最小代码”意味着“无需安装整个项目即可在自己的计算机上运行代码所需的全部内容”。没有人可以在计算机上运行你的代码片段('stacks'没有定义,也不是'hc')。 –

回答

1

你的问题是在这里:

with open('stackList.json', 'a') as f: 

你打开在“追加”模式下的文件,所以每个代码被执行它的时候追加转储文件。您抱怨的结果来自于此,第二次运行时mydict为空。

您必须以“w”(“write”)模式打开文件,它将覆盖现有内容(最终可以为每个调用创建一个新的转储文件)或切换到"jsonline" format(但您的文件将不再是一个有效的JSON文件,阅读它的任何代码将不得不知道将其解析为jsonlines)

+0

好吧,我明白了。但打开('stackList.json','a')作为f:在for和try内也不可取? –

+0

@Heenashree你应该在写模式下打开并保持文件在任何循环之外,不要在循环中打开,写入,关闭 –

+0

不够公平。 :) –