web-dev-qa-db-ja.com

JSON(オブジェクトプロパティが存在する)かどうかを確認し、デコードされたUnicodeとして出力する

Instagram API から次のデータを取得します。次のコードを使用して、propertyからテキストcaptionを取得しようとしています。

data = simplejson.load(info) # info is retrieved using the urllib2 
    for post in data['data']: 
        if post['caption'] is not "null":
            try:
                post['caption']['text']
            except NameError:
                post['caption']['text'] = 0
            if post['caption']['text'] is not 0:
                print post['caption']['text']

しかし、TypeError: 'NoneType' object has no attribute '__getitem__'エラー+ UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-5: cha racter maps to <undefined> Unicode文字列の印刷中にエラーが発生しました

以下は、infoに取得および保存されるJSONデータです

{
   "pagination":{
      "next_url":"https:\/\/api.instagram.com\/v1\/users\/self\/feed?access_token=184046392.f59def8.c5726b469ad2462f85c7cea5f72083c0&count=3&max_id=247821697921944007_6064449",
      "next_max_id":"247821697921944007_6064449"
   },
   "meta":{
      "code":200
   },
   "data":[
      {
         "attribution":null,
         "tags":[
            "usausausa",
            "olympics"
         ],
         "type":"image",
         "location":{
            "latitude":37.785929,
            "name":"Aquatech Swim School",
            "longitude":-122.278718,
            "id":16343815
         },
         "comments":{
            "count":0,
            "data":[

            ]
         },
         "filter":"Valencia",
         "created_time":"1343765260",
         "link":"http:\/\/instagr.am\/p\/NwhEktJvEp\/",
         "likes":{
            "count":0,
            "data":[

            ]
         },
         "images":{
            "low_resolution":{
               "url":"http:\/\/distilleryimage1.s3.amazonaws.com\/61d9cbeedb4b11e1b8e822000a1e8b8e_6.jpg",
               "width":306,
               "height":306
            },
            "thumbnail":{
               "url":"http:\/\/distilleryimage1.s3.amazonaws.com\/61d9cbeedb4b11e1b8e822000a1e8b8e_5.jpg",
               "width":150,
               "height":150
            },
            "standard_resolution":{
               "url":"http:\/\/distilleryimage1.s3.amazonaws.com\/61d9cbeedb4b11e1b8e822000a1e8b8e_7.jpg",
               "width":612,
               "height":612
            }
         },
         "caption":{
            "created_time":"1343765325",
            "text":"Part of my job to watch swimming. #olympics #USAUSAUSA",
            "from":{
               "username":"kissinkatkelly",
               "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_4672491_75sq_1341713095.jpg",
               "id":"4672491",
               "full_name":"kissinkatkelly"
            },
            "id":"247843973390332239"
         },
         "user_has_liked":false,
         "id":"247843429330383145_4672491",
         "user":{
            "username":"kissinkatkelly",
            "website":"",
            "bio":"I sing the body electric\r\n\r\nBay Area, CA",
            "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_4672491_75sq_1341713095.jpg",
            "full_name":"kissinkatkelly",
            "id":"4672491"
         }
      },
      {
         "attribution":null,
         "tags":[

         ],
         "type":"image",
         "location":{
            "latitude":36.020832061,
            "longitude":-121.548835754
         },
         "comments":{
            "count":4,
            "data":[
               {
                  "created_time":"1343763343",
                  "text":"I wanna cut your mustache off. \ue313\ue313\ue313\ue004",
                  "from":{
                     "username":"glorias_noodles",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_24432017_75sq_1343633079.jpg",
                     "id":"24432017",
                     "full_name":"\ue340MeGusta Gloria\ue340"
                  },
                  "id":"247827343962686703"
               },
               {
                  "created_time":"1343763844",
                  "text":"Ahaha^",
                  "from":{
                     "username":"chloe_carter",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_44766575_75sq_1343509145.jpg",
                     "id":"44766575",
                     "full_name":"Chloe Carter"
                  },
                  "id":"247831551235474746"
               },
               {
                  "created_time":"1343763958",
                  "text":"Amazingg thoo",
                  "from":{
                     "username":"saulyp",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_18051263_75sq_1335648741.jpg",
                     "id":"18051263",
                     "full_name":"Saul Perez"
                  },
                  "id":"247832506790200642"
               },
               {
                  "created_time":"1343764298",
                  "text":"@popesaintvictor where is that? :o",
                  "from":{
                     "username":"youknow_jameson",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_194001394_75sq_1343613135.jpg",
                     "id":"194001394",
                     "full_name":"Jameson Medina"
                  },
                  "id":"247835358103225704"
               }
            ]
         },
         "filter":"Normal",
         "created_time":"1343763202",
         "link":"http:\/\/instagr.am\/p\/NwdJRpBkfX\/",
         "likes":{
            "count":611,
            "data":[
               {
                  "username":"jakyvedder",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_18148021_75sq_1336938690.jpg",
                  "id":"18148021",
                  "full_name":"Janycken"
               },
               {
                  "username":"nadjasinbruker",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_174576513_75sq_1343582260.jpg",
                  "id":"174576513",
                  "full_name":"Nadja"
               },
               {
                  "username":"vivi11",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_1193390_75sq_1338169730.jpg",
                  "id":"1193390",
                  "full_name":"Viviana Rodriguez"
               },
               {
                  "username":"me_4_eva",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_181498114_75sq_1343506811.jpg",
                  "id":"181498114",
                  "full_name":"Kelly"
               },
               {
                  "username":"roxczajkowski",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_9367244_75sq_1343696914.jpg",
                  "id":"9367244",
                  "full_name":"Czajkowski \u041a\u043e\u0440\u0448\u0443\u043d\u043e\u0432\u0430"
               },
               {
                  "username":"arsi1989",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_201586134_75sq_1343761866.jpg",
                  "id":"201586134",
                  "full_name":"Arsalan MemOn"
               },
               {
                  "username":"puppyluva",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_201579504_75sq_1343760137.jpg",
                  "id":"201579504",
                  "full_name":"puppyluva"
               },
               {
                  "username":"paulinamurr",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_49364097_75sq_1343428499.jpg",
                  "id":"49364097",
                  "full_name":"Paulina Murray"
               },
               {
                  "username":"_mcquadeface_",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_20679753_75sq_1327617901.jpg",
                  "id":"20679753",
                  "full_name":"Emily McQuade"
               }
            ]
         },
         "images":{
            "low_resolution":{
               "url":"http:\/\/distilleryimage11.s3.amazonaws.com\/96cd5b90db4611e1827612313814176c_6.jpg",
               "width":306,
               "height":306
            },
            "thumbnail":{
               "url":"http:\/\/distilleryimage11.s3.amazonaws.com\/96cd5b90db4611e1827612313814176c_5.jpg",
               "width":150,
               "height":150
            },
            "standard_resolution":{
               "url":"http:\/\/distilleryimage11.s3.amazonaws.com\/96cd5b90db4611e1827612313814176c_7.jpg",
               "width":612,
               "height":612
            }
         },
         "caption":null,
         "user_has_liked":false,
         "id":"247826160271378391_605400",
         "user":{
            "username":"popesaintvictor",
            "website":"http:\/\/popesaintvictor.com",
            "bio":"artist, friend, and brand designer for blood:water mission in nashville, tennessee. \r\n\r\nhusband to @ohsoamy\r\n\r\nbe inspired. be awesome.\r\n",
            "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_605400_75sq_1342893414.jpg",
            "full_name":"pope saint victor",
            "id":"605400"
         }
      },
      {
         "attribution":null,
         "tags":[

         ],
         "type":"image",
         "location":{
            "latitude":40.738834381,
            "longitude":-73.994163513
         },
         "comments":{
            "count":6,
            "data":[
               {
                  "created_time":"1343762733",
                  "text":"Nice :)",
                  "from":{
                     "username":"belieberpernille99",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_186196238_75sq_1341347304.jpg",
                     "id":"186196238",
                     "full_name":"official belieber"
                  },
                  "id":"247822232418879860"
               },
               {
                  "created_time":"1343762748",
                  "text":"Those pants \ud83d\ude0d",
                  "from":{
                     "username":"morganmarzulli",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_29155556_75sq_1337653621.jpg",
                     "id":"29155556",
                     "full_name":"morganmarzulli"
                  },
                  "id":"247822351461615990"
               },
               {
                  "created_time":"1343762777",
                  "text":"That outfit is to die for. I love her pants! They're so fun. \ud83d\udc4d",
                  "from":{
                     "username":"ninavnegron",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_18421926_75sq_1343356820.jpg",
                     "id":"18421926",
                     "full_name":"Nina V"
                  },
                  "id":"247822600452278654"
               },
               {
                  "created_time":"1343762782",
                  "text":"YEAH THEIR COOL",
                  "from":{
                     "username":"belieberpernille99",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_186196238_75sq_1341347304.jpg",
                     "id":"186196238",
                     "full_name":"official belieber"
                  },
                  "id":"247822639375419775"
               },
               {
                  "created_time":"1343762782",
                  "text":"Another day another shoot! Look out for me and my chicest staff on @racked!",
                  "from":{
                     "username":"rebeccaminkoff",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_6064449_75sq_1332274636.jpg",
                     "id":"6064449",
                     "full_name":"Rebecca Minkoff"
                  },
                  "id":"247822641497737600"
               },
               {
                  "created_time":"1343764430",
                  "text":"Hot mama! Miss you!",
                  "from":{
                     "username":"ashleekoston",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_12925089_75sq_1340081366.jpg",
                     "id":"12925089",
                     "full_name":"ashleekoston"
                  },
                  "id":"247836463642020446"
               }
            ]
         },
         "filter":"Walden",
         "created_time":"1343762670",
         "link":"http:\/\/instagr.am\/p\/NwcIVwRYnH\/",
         "likes":{
            "count":528,
            "data":[
               {
                  "username":"claireyoung48",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_40091175_75sq_1338778945.jpg",
                  "id":"40091175",
                  "full_name":"claireyoung48"
               },
               {
                  "username":"l_christine_k",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_14871166_75sq_1341962995.jpg",
                  "id":"14871166",
                  "full_name":"Lauren Kawano"
               },
               {
                  "username":"grcdaly",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_41426567_75sq_1335023058.jpg",
                  "id":"41426567",
                  "full_name":"\u24bc\u24c7\u24b6\u24b8\u24ba \u24b9\u24b6\u24c1\u24e8"
               },
               {
                  "username":"vanessaalcalaa",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_18115905_75sq_1342828120.jpg",
                  "id":"18115905",
                  "full_name":"Vanessa Alcala"
               },
               {
                  "username":"makennalenover",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_6464394_75sq_1343268613.jpg",
                  "id":"6464394",
                  "full_name":"Makenna Lenover"
               },
               {
                  "username":"heyitsmaryanne",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_623979_75sq_1340838647.jpg",
                  "id":"623979",
                  "full_name":"Maryanne L"
               },
               {
                  "username":"sarabeen",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/anonymousUser.jpg",
                  "id":"6463387",
                  "full_name":"sarabeen"
               },
               {
                  "username":"boldincrimson",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_191122242_75sq_1341889110.jpg",
                  "id":"191122242",
                  "full_name":"Pilar Chapa"
               },
               {
                  "username":"elizzabethhope",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_6761399_75sq_1342553102.jpg",
                  "id":"6761399",
                  "full_name":"Lizz\u270c"
               }
            ]
         },
         "images":{
            "low_resolution":{
               "url":"http:\/\/distilleryimage7.s3.amazonaws.com\/59bc708edb4511e1b7ea22000a1cbb16_6.jpg",
               "width":306,
               "height":306
            },
            "thumbnail":{
               "url":"http:\/\/distilleryimage7.s3.amazonaws.com\/59bc708edb4511e1b7ea22000a1cbb16_5.jpg",
               "width":150,
               "height":150
            },
            "standard_resolution":{
               "url":"http:\/\/distilleryimage7.s3.amazonaws.com\/59bc708edb4511e1b7ea22000a1cbb16_7.jpg",
               "width":612,
               "height":612
            }
         },
         "caption":null,
         "user_has_liked":false,
         "id":"247821697921944007_6064449",
         "user":{
            "username":"rebeccaminkoff",
            "website":"http:\/\/www.rebeccaminkoff.com",
            "bio":"The Downtown Romantic. My life, my work, my world.",
            "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_6064449_75sq_1332274636.jpg",
            "full_name":"Rebecca Minkoff",
            "id":"6064449"
         }
      }
   ]
}
16
Viren Rajput

ポストキャプションに「テキスト」が存在するかどうかの複雑なテストは必要ありません。このコードは、投稿したJSON文字列とうまく機能します。

_for post in data['data']:
    if post.get('caption'):
        print post['caption'].get('text', 0)
_

さらに、Instagramが空のJSONを送信した場合にループを開始するときに、より防御的でdata.get('data', [])を参照することもできます。

26
Gonzalo

基本的にjsonがオブジェクトをロードしてデシリアライズすると、JSONのnullはpythonのNoneになります。

だからあなたのライン:

if post['caption'] is not 'null':

になるはずです:

if post['caption']:

7
favoretti