Python– ;不检索所有json对象,仅检索最后一个

Python– ;不检索所有json对象,仅检索最后一个,python,json,Python,Json,我试图从Cranfield集合(在.json文件中)的文档中实现一个反向索引。下面是.json文件包含的一部分内容。实际上有1400条,但这里是第一行和最后一行 { "add" : { "doc" : { "id" : 1, "author" : "brenckman,m.", "bibliography" : "j. ae. scs. 25, 1958, 324.", "body" : "a lot of text.",

我试图从Cranfield集合(在.json文件中)的文档中实现一个反向索引。下面是.json文件包含的一部分内容。实际上有1400条,但这里是第一行和最后一行

{
  "add" : {
    "doc" : {
      "id" : 1,
      "author" : "brenckman,m.",
      "bibliography" : "j. ae. scs. 25, 1958, 324.",
      "body" : "a lot of text.",
      "title" : "title 1."
    }
  },
  "add" : {
    "doc" : {
      "id" : 1400,
      "author" : "kleeman,p.w.",
      "bibliography" : "arc r + m.2971, 1953.",
      "body" : "a lot of text.",
      "title" : "title 2."
    }
  },
  "commit" : { }
}
但是,我甚至无法正确地读取.json文件来开始创建反向索引。当我运行下面给出的代码时,它只打印.json文件的最后一个对象以及
“commit”:{}
。所以基本上所有的事情都是从我上面例子中的第二个“add”开始的

考虑到有1400个对象,我不明白为什么我只得到最后一个。我的代码如下。例如,我还使用
print(len(data))
进行了检查,预计1400时返回2。任何帮助都将不胜感激

import json
from pprint import pprint

with open("cranfield-data.json", encoding="utf-8") as data_file:
  data = json.loads(data_file.read())

pprint((data))

您的JSON格式不正确。一个JSON对象,就像它映射到的Python字典一样,每个键只能有一个项。您每次都使用相同的键“add”


您可能需要一个对象数组,而不是单个对象。

您当前遇到的问题是json对象有一个带多个值的键。解决方案是使用一个定制的JSONDecoder.object\u pairs\u钩子,正如本文前面解释的那样


好的,我明白了。这可能是显而易见的,但我对python和json还很陌生。我的导师给了我这个.json文件,所以我认为它已经可以使用了。因此,如果我理解正确,每个“add”元素都需要是新数组的开始?JSON对象中的键不需要是唯一的,但JSON解码器也不需要保留重复的键。JSON对象的语义只是没有定义。@chepner好的,那么这是否意味着我的初始代码应该可以工作?你知道我为什么不返回.json文件的所有1400个对象吗?json可能不需要,但Python需要。字典的全部意义在于,你可以通过它们的名字来唯一地引用它的键。好的。所以我基本上有1400个相同键“add”的实例,但它应该是这些字典的列表吗?@pault,我想我现在意识到我想要什么,是的。那么每个“add”元素都应该是数组的开始?每个“doc”和所有其他元素都应该是它们自己的数组吗?可能重复的@refnet可能重复没有问题,但是如果您的问题是用这个解决的,那么最好将它作为将来可能有相同问题的人的主要答案。如果这是答案,我们应该以副本的形式结束这个问题。@chepner是的,最好将它作为副本存档。