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

用Python解析复杂的JSON对象:搜索特定的键/值对,python,json,Python,Json,一般问题:如何使用Python在JSON中搜索特定的键:值对 具体案例的详细信息:我正在阅读约45000个JSON对象,每个对象看起来都很像。 如您所见,在每个JSON中都有几个具有相同键(但值不同)的字典:“FaceName,“facetLabel”,“facetValues” 我对以“facetName”开头的字典感兴趣:“soggettof”,类似于: { "facetName": "soggettof", "facetLabel": "Soggetto", "facetVal

一般问题:如何使用Python在JSON中搜索特定的
键:值

具体案例的详细信息:我正在阅读约45000个JSON对象,每个对象看起来都很像。
如您所见,在每个JSON中都有几个具有相同键(但值不同)的字典:
“FaceName
“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"
    ]
{
“facetName”:“soggettof”,
“facetLabel”:“Soggetto”,
“价值观”:[
[
“chiesa-storia-documenti”,
“chiesa-storia-documenti”,
"1"
],
[
“espiazione-mare Mediterrano-antichita-congressi-munster-1999”,
“espiazione-mare Mediterrano-antichita-congressi-munster-1999”,
"1"
],
[
“罗莎·康巴滕蒂-斯托里亚法”,
“罗莎·康巴滕蒂-斯托里亚法”,
"1"
],
[
“pavia-storia ecclesiastica-origini第12节。”,
“pavia-storia ecclesiastica-origini第12节。”,
"1"
],
[
“pavia-storia-origini第12节。”,
“pavia-storia-origini第12节。”,
"1"
],
[
“波斯-斯维卢波经济城-1850-1900-方蒂外交学院”,
“波斯-斯维卢波经济城-1850-1900-方蒂外交学院”,
"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"]]}]}
拥有这个最外层的容器很重要,因为它是通过它的,所以你必须深入到你想要的部分。一旦你有了实际的数据,重新格式化它以使其结构清晰通常是很有帮助的。你可以手工操作,也可以让计算机通过
打印(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)

由于
FaceRecords
是一个
列表
,因此需要对其进行线性搜索,如图所示,以找到所需的记录。

首先检查该键是否存在,如果存在,然后使用它。有人能告诉我为什么该问题被否决吗?@PadraicCunningham嗨,谢谢。也许我的问题不够清楚(我会编辑它):这些键”facetName、“facetLabel”、“facetValues”总是在同一个对象中多次出现,但它们的值会发生变化。我感兴趣的是一个字典,它正好有“facetName”:“soggettof”、“facetLabel”:“Soggetto”、“facetValues”:[…]。希望这能澄清一点。嗨,谢谢你的回答,但我编辑了这个问题,也许现在它更清楚了。我的代码假设
json_obj
是你感兴趣的字典。注意,一个键不能在字典中出现多次。嗯,好吧。但我的问题是我不知道如何找到我的字典:在每个字典,钥匙有一次。但每次都有6-7本字典,我的(我现在注意到了)是第三本,每次有7本。谢谢编辑答案。不幸的是,我似乎无法解释自己:-(你的代码有效,但它给了我所有子对象的
facetValues
。我只需要正确的一个(字典中的
soggetof
作为键
facetName
的值)。我试图在问题中解释这一点(似乎没有多少成功)是的。我注意到可能正确的问题应该是“如何使用Python在JSON中找到特定的键值对?”。你认为我也必须问这个特定(但更一般、更有用)的问题吗?