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

奥布里

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

具体情况的详细信息:我正在读取〜45'000 JSON对象,其中每个对象看起来都像这样
正如你所看到的,每一个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仅在我感兴趣的字典中获取列表的值

马蒂诺

我发现您的问题有些困惑,部分是因为其中显示的数据实际上并不是您要从中提取信息的JSON对象,而只是您要从中提取信息的一个子JSON对象的示例。幸运的是,您有一个到最外层容器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)),尽管从中获得的结果有时会在其中留出太多空白(这可能适得其反)。

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

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"]]}
             ]
            }

一旦有了类似的东西,通常很容易确定所需的代码。在这种情况下,它是:

target_facet_name = "soggettof"

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

由于facetRecords是a list,因此需要对它们进行线性搜索(如图所示)才能找到所需的一个或多个。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用 Javascript 搜索特定的 JSON 键值对?

使用Python解析复杂的JSON

如何在python中使用特定键值对复杂的json进行排序

使用Jackson解析复杂的JSON对象列表

使用TypeScript解析复杂的json对象

如何使用数组 .filter() 在 JSON 对象数组中搜索键值

如何使用C#在Unity中解析复杂的JSON对象

在Java中使用GSON解析复杂的Json对象

解析 json 对象键值 postgresql 的文本

在 Python 中解析复杂的 JSON

使用 json 文件中的特定键值对更新 python 字典

使用Go解析复杂的JSON

如何解析此XML并搜索特定的键值

我如何使用 volley andorid 解析 json 对象内的 json 键值对

使用python递归解析复杂的api json数据

使用python搜索特定密钥的JSON文件

如何对复杂对象使用Angular 8键值和compareFn

在Python中使用JSON对象解析文件

解析数组中的JSON数组并使用键值

使用混合键值对和数组解析JSON

如何在JSON解析期间在JSON对象内的Java中搜索特定密钥

从复杂的 json 对象中获取特定信息

使用 JQ 解析 JSON 嵌套对象,使用 select 匹配嵌套对象中的键值,同时显示现有结构

使用JSON的jq为数组中的每个元素在对象中输出特定的键值

如何使用PHP计算JSON数组中存在具有特定键值对的对象的安装次数

如何循环遍历 JSON 对象以使用 jq 提取特定键值

如何获取 json 对象中的键值(Python)

如何从多个JSON对象的特定键解析值python

使用 SED 命令检索 JSON 对象键值