JSONni simplejson bilan qanday qilib to'g'ri tahlil qilish kerak?

Quyidagi JSON dizgesine ega bo'lishim mumkin:

{ "response" : [ [ { "name" : "LA_",
          "uid" : 123456
        } ],
      [ { "cid" : "1",
          "name" : "Something"
        } ],
      [ { "cid" : 1,
          "name" : "Something-else"
        } ]
    ] }

yoki quyidagilardan birini tanlang:

{"error":"some-error"}

{ "response" : [ [ { "name" : "LA_",
          "uid" : 123456
        } ],
      [ { "cid" : "1",
          "name" : ""
        } ],
      [ { "cid" : 1,
          "name" : "Something-else"
        } ]
    ] }

{ "response" : [ [ { "name" : "LA_",
          "uid" : 123456
        } ] ] }

Shunday qilib, men barcha bolalar va elementlarning mavjudligini bilmayman. Something qiymatini olish uchun quyidagi tekshiruvlarni bajarish kifoya qiladimi:

if jsonstr.get('response'):
    jsonstr = jsonstr.get('response')[1][0]
    if jsonstr:
        name = jsonstr.get('name')
        if jsonstr: # I don't need empty value
            # save in the database

Xuddi shu narsa soddalashtirilishi mumkinmi?

1

1 javoblar

Ichki ob'ektlaringiz buyurtma qilish har safar uni ajratib turganda bir xil bo'ladi, shuning uchun endekslash ob'ekt kodini name atributiga mos keladigan < kodi> nimadir .

Ushbu agar ifodalarini joylashtirish o'rniga, ro'yxatni tushunish . Agar siz javob kalitini yineleyseniz, har birida bir lug'atga ega bo'lgan ro'yxatlarning ro'yxatini olasiz:

>>> data = {"response":[[{"uid":123456,"name":"LA_"}],[{"cid":"1","name":"Something"}],[{"cid":1,"name":"Something-else"}]]}
>>> [lst for lst in data.get('response')]
[[{'name': 'LA_', 'uid': 123456}], [{'name': 'Something', 'cid': '1'}], [{'name': 'Something-else', 'cid': 1}]]

Har bir ro'yxatdagi birinchi elementni ( lst [0] ) endekslerseniz, siz moslamalarni ro'yxati bilan yakunlanadi:

>>> [lst[0] for lst in data.get('response')]
[{'name': 'LA_', 'uid': 123456}, {'name': 'Something', 'cid': '1'}, {'name': 'Something-else', 'cid': 1}]

Ob'ektlarda name xususiyati bilan mos kelish uchun siz ro'yxatni tushunishda agar shartini qo'shsangiz, kerakli obyektni o'z ichiga olgan bitta element bilan ro'yxatni olasiz:

>>> [lst[0] for lst in data.get('response') if lst[0].get('name') == 'Something']
[{'name': 'Something', 'cid': '1'}]

Va keyin yakuniy ro'yxatning birinchi elementini indekslash orqali kerakli ob'ektni olasiz:

>>> [lst[0] for lst in data.get('response') if lst[0].get('name') == 'Something'][0]
{'name': 'Something', 'cid': '1'}

Shunday qilib, siz uni o'zingizning vazifangizga aylantirishingiz va hayotingiz bilan harakat qilishingiz mumkin:

def get_obj_by_name(data, name):
    objects = [lst[0] for lst in data.get('response', []) if lst[0].get('name') == name]
    if objects:
        return objects[0]

    return None

print get_obj_by_name(data, 'Something')
# => {'name': 'Something', 'cid': '1'}

print get_obj_by_name(data, 'Something')['name']
# => 'Something'

response kalit topilmasa, moslashuvchan bo'lishi va None qaytishi kerak:

print get_obj_by_name({"error":"some-error"}, 'Something')
# => None
2
qo'shib qo'ydi
Rahmat, @jathanism, batafsil javob uchun. Aslini olganda, "Menga nimadir" men uchun qidiraman - bu boshqa qiymat bo'lishi mumkin. Uchinchi taraf tomon menga ushbu elementning identifikatorini taqdim etmaydi, shuning uchun ularning ketma-ketligiga ishonish kerak.
qo'shib qo'ydi muallif LA_, manba
Salomat bo'ling. :)
qo'shib qo'ydi muallif jathanism, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming

Javascript UZB
Javascript UZB
99 ishtirokchilar

@js_uzb @vuejs_uz @react_uz @nodejs_uz @angular_uz @ngTashkent @yiiframework_uz @laravel_uz @linux_uzbek @python_uz @swift_uzb —————— @uzdevgroup @UzGeeksGroup ——— @UzDev_Jobs @jobs_uzb