用Python解析复杂的JSON对象:搜索特定的键/值pai

2024-06-16 08:43:01 发布

您现在位置:Python中文网/ 问答频道 /正文

一般问题:如何使用Python在JSON中搜索特定的key:value对?在

特定案例的详细信息:我正在阅读~45000个JSON对象,每个对象看起来都是like this one
如您所见,在每个JSON中都有几个具有相同键(但值不同)的字典:"facetName"facetLabel""facetValues"
我对以"facetName": "soggettof"开头的字典很感兴趣,它是这样的:

{
  "facetName": "soggettof",
  "facetLabel": "Soggetto",
  "facetValues": [
    [
      "chiesa - storia - documenti",
      "chiesa - storia - documenti",
      "1"
    ],
    [
      "espiazione - mare mediterraneo <bacino> - antichita - congressi - munster - 1999",
      "espiazione - mare mediterraneo <bacino> - antichita - congressi - munster - 1999",
      "1"
    ],
    [
      "lega rossa combattenti - storia",
      "lega rossa combattenti - storia",
      "1"
    ],
    [
      "pavia - storia ecclesiastica - origini-sec. 12.",
      "pavia - storia ecclesiastica - origini-sec. 12.",
      "1"
    ],
    [
      "pavia <diocesi> - storia - origini-sec. 12.",
      "pavia <diocesi> - storia - origini-sec. 12.",
      "1"
    ],
    [
      "persia - sviluppo economico - 1850-1900 - fonti diplomatiche inglesi",
      "persia - sviluppo economico - 1850-1900 - fonti diplomatiche inglesi",
      "1"
    ]

请注意,并不是所有的JSON对象都有。在

如何获取facetValues列表的值,但只在我感兴趣的字典中?在


Tags: 对象json字典secoriginipaviadocumentimare
1条回答
网友
1楼 · 发布于 2024-06-16 08:43:01

我发现你的问题有点令人困惑,部分原因是其中显示的数据是而不是实际上是您需要从中提取信息的JSON对象,而只是您想要从中提取信息的子JSON对象的一个示例。幸运的是,您有一个link到最外层的容器JSON对象(即使其中对应的子JSON对象中的数据不同)。以下是来自该链接的数据:

json_obj = {"numFound":1,"start":0,"rows":3,"briefRecords":[{"progressivoId":0,"codiceIdentificativo":"IT\\ICCU\\LO1\\0120590","autorePrincipale":"Savoia, Carlo","titolo":"Per la inaugurazione dell'Asilo infantile Strozzi nei locali della caserma Filippini già convento della Vittoria / parole di mons. Carlo Savoia","pubblicazione":"Mantova : Tip. Eredi Segna, 1870","livello":"Monografia","tipo":"Testo a stampa","numeri":[],"note":[],"nomi":[],"luogoNormalizzato":[],"localizzazioni":[],"citazioni":[]}],"facetRecords":[{"facetName":"level","facetLabel":"Livello bibliografico","facetValues":[["Monografia","m","1"]]},{"facetName":"tiporec","facetLabel":"Tipo di documento","facetValues":[["Testo a stampa","a","1"]]},{"facetName":"nomef","facetLabel":"Autore","facetValues":[["savoia, carlo","savoia, carlo","1"]]},{"facetName":"soggettof","facetLabel":"Soggetto","facetValues":[["mantova - asili infantili","mantova - asili infantili","1"]]},{"facetName":"luogof","facetLabel":"Luogo di pubblicazione","facetValues":[["mantova","mantova","1"]]},{"facetName":"lingua","facetLabel":"Lingua","facetValues":[["italiano","ita","1"]]},{"facetName":"paese","facetLabel":"Paese","facetValues":[["italia","it","1"]]}]}

重要的是要有这个最外层的容器,因为通过它你将不得不深入到你想要的部分。一旦你有了实际的数据,通常有助于重新格式化它,使其结构清晰。你可以手工操作,也可以让计算机通过print(json.dumps(json_obj, indent=2))来完成,尽管这样做的结果有时会有太多的空白(这可能会适得其反)。在

在这种情况下,下面是我手动生成的更简洁的版本,它仍然让我看到数据的总体布局:

^{pr2}$

一旦您有了这样的东西,通常很容易确定需要什么代码。在这种情况下是:

target_facet_name = "soggettof"

for record in json_obj["facetRecords"]:
    if record["facetName"] == target_facet_name:
        for value in record["facetValues"]:
            print(value)

由于facetRecords是一个list,因此需要按所示对其进行线性搜索,以找到想要的对象。在

相关问题 更多 >