Попробуйте - кроме трех возможностей в пути JSON - PullRequest
0 голосов
/ 15 октября 2019

У меня есть несколько json с немного разными путями, например, первый:

dcSubject:
    fre:
         0: Marie(Sainte)
         1: Anges

, второй:

   dcSubject:
        en:
             0: Railroads--Ireland

и третий без dcSubject вообще. Поэтому я хочу try, если есть элемент пути ["dcSubject"] ["en"] или элемент ["dcSubject"] ["fre"] и присвоить ему значение, или, если его нетиз этого присвойте пустое значение. Я попытался:

try:
    subjects = element["dcSubject"]["en"]
except:
    subjects = element["dcSubject"]["fre"]
else:
    subjects = ""

, но он, очевидно, не работает, потому что печатает пустой предмет, если путь "en" правильный. Тогда я попытался (просто для удовольствия)

try:
    subjects = element["dcSubject"]["en"] or element["dcSubject"]["fre"]
except:
    subjects = ""

Но это не правильно.

Можно ли что-то сделать?

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

возможно, вам следует пойти в этом направлении, чтобы использовать рекурсивную функцию для поиска значения для нужного ключа во вложенном json (если ключ не существует, вы получите пустой список, если функция ключа существует вернет значение для связанного ключа):

element = {"dcSubject":{"fre":{"0": "Marie","1": "Anges"}}}

def findkeys(node, kv):
    if isinstance(node, list):
        for i in node:
            for x in findkeys(i, kv):
               yield x
    elif isinstance(node, dict):
        if kv in node:
            yield node[kv]
        for j in node.values():
            for x in findkeys(j, kv):
                yield x

if list(findkeys(element,'en')) != []:
    subjects = list(findkeys(element,'en'))
elif list(findkeys(element,'fre')) != []:
    subjects = list(findkeys(element,'fre'))
else:
    subjects = ""

print (subjects)
0 голосов
/ 15 октября 2019

Вы можете попробовать метод .get(). По умолчанию он равен None, если ключ не существует

subjects = ""

if element["dcSubject"].get("en"):
    subjects = element["dcSubject"]["en"]
elif element["dcSubject"].get("fr"):
    subjects = element["dcSubject"]["fr"]

Это не повысит KeyError, если "en" или "fr" не существует, и пропустит блок кода, еслиони просто пустой массив

...