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

时间:2015-06-30 12:32:09

标签: python json

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

特定案例的详细信息:我正在阅读~45,000个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列表的值,但只能在我感兴趣的字典中?

1 个答案:

答案 0 :(得分:5)

我发现你的问题有点令人困惑,部分是因为其中显示的数据确实是你需要从中提取信息的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))执行此操作,尽管其中的结果有时可能会有太多的空白区域(这可能会适得其反)。

就是这种情况,下面是我手动做的更简洁的版本,让我看到数据的整体布局:

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)

由于facetRecordslist,因此需要通过它们进行线性搜索,以找到想要的那个。