2016-03-24 2 views
0

Я пытаюсь обработать объект ответа, возвращенный из API-интерфейса BitBucket в Python. У меня есть следующий код, чтобы попытаться обработать ответ:Обработка многомерного объекта ответа из REST API в словаре Python

import requests 
import json 

url = 'http:www.sampleurl.com' 
myResponse = requests.get(url,auth=("myusername","mypassword")) 

jd = myResponse.json() 
print(jd.keys()) 

И ключи отлично возвращаются. Однако в пределах определенного ключа возвращается список. Меня интересуют значения, содержащиеся в этом списке. В частности, меня интересуют значения внутри «значений». Есть ли способ разобрать информацию, содержащуюся в значениях до/после, становится списком?

Моя проблема сводится к тому, что у меня возникают проблемы с доступом к информации в родителях JSON Array в следующем ответе на образец.

{ 
    "pagelen": 30, 
    "values": [ 
    { 
     hash: "61d9e64348f9da407e62f64726337fd3bb24b466", 
     links: { 
      self: { 
       href: "https://api.bitbucket.org/2.0/repositories/atlassian/atlassian-rest/commit/61d9e64348f9da407e62f64726337fd3bb24b466" 
      }, 
      comments: { 
       href: "https://api.bitbucket.org/2.0/repositories/atlassian/atlassian-rest/commit/61d9e64348f9da407e62f64726337fd3bb24b466/comments" 
      }, 
      patch: { 
       href: "https://api.bitbucket.org/2.0/repositories/atlassian/atlassian-rest/patch/61d9e64348f9da407e62f64726337fd3bb24b466" 
      }, 
      html: { 
       href: "https://api.bitbucket.org/atlassian/atlassian-rest/commits/61d9e64348f9da407e62f64726337fd3bb24b466" 
      }, 
      diff: { 
       href: "https://api.bitbucket.org/2.0/repositories/atlassian/atlassian-rest/diff/61d9e64348f9da407e62f64726337fd3bb24b466" 
      }, 
      approve: { 
       href: "https://api.bitbucket.org/2.0/repositories/atlassian/atlassian-rest/commit/61d9e64348f9da407e62f64726337fd3bb24b466/approve" 
      } 
     }, 
     repository: { 
      links: { 
       self: { 
        href: "https://api.bitbucket.org/2.0/repositories/atlassian/atlassian-rest" 
       }, 
       avatar: { 
        href: "https://d3oaxc4q5k2d6q.cloudfront.net/m/bf1e763db20f/img/language-avatars/java_16.png" 
       } 
      }, 
      full_name: "atlassian/atlassian-rest", 
      name: "atlassian-rest" 
     }, 
     author: { 
      raw: "Joseph Walton <[email protected]>", 
      user: { 
       username: "jwalton", 
       display_name: "Joseph Walton", 
       links: { 
        self: { 
         href: "https://api.bitbucket.org/2.0/users/jwalton" 
        }, 
        avatar: { 
         href: "https://secure.gravatar.com/avatar/8e6e91101e3ed8a332dbebfdf59a3cef?d=https%3A%2F%2Fd3oaxc4q5k2d6q.cloudfront.net%2Fm%2Fbf1e763db20f%2Fimg%2Fdefault_avatar%2F32%2Fuser_blue.png&s=32" 
        } 
       } 
      } 
     }, 
     parents: [{ 
      hash: "59721f593b020123a75424285845325126f56e2e", 
      links: { 
       self: { 
        href: "https://api.bitbucket.org/2.0/repositories/atlassian/atlassian-rest/commit/59721f593b020123a75424285845325126f56e2e" 
       } 
      } 
     }, { 
      hash: "56c49d8b2ae3a094fa7ba5a1251d6dd2c7c66993", 
      links: { 
       self: { 
        href: "https://api.bitbucket.org/2.0/repositories/atlassian/atlassian-rest/commit/56c49d8b2ae3a094fa7ba5a1251d6dd2c7c66993" 
       } 
      } 
     }], 
     date: "2013-10-21T07:21:51+00:00", 
     message: "Merge remote-tracking branch 'origin/rest-2.8.x' " 
    } 
    ], 
    "page": 1 
} 
+0

Вы просто хотите сократить данные ответа только на интересующие вас ключи? Я не понимаю вопрос? –

+0

Это побочный эффект того, что я ищу. Я ищу, чтобы сгладить объект ответа, чтобы у меня было имя автора, сообщение, время на одном уровне. Моя основная проблема заключается в том, что для одной транзакции я не могу получить доступ к такой информации, как имя автора, потому что она похожа на несколько слоев в ответ json. –

+0

1) Существует не программный способ сделать это, так как вложенные Dicts могут дублировать имена ключей. 2) Какой язык вы используете для просмотра/анализа ответа JSON, потому что Python может легко получить нужные вам данные, независимо от глубины. Думаю, я не могу сказать из вашего кода, какая часть не работает, и что вам нужно, а не то, что вы получаете. –

ответ

1

Не уверен, правильно ли я понял вопрос, но вы не указали, что отсутствуют котировки, упомянутые jDo. Предполагая, что это хорошо формируется ДИКТ, вы должны быть в состоянии получить доступ к родительской информации следующим образом:

parents = jd["values"][0]["parents"] 

Затем вы можете пройти по списку родителей и делать все, что вам нравится с ним:

for parent in parents: 
    do_sth_with_parent(parent["hash"], parent["links"]) 

Отвечает ли это на вопрос?

+0

FYI, у дикта нет пропущенных котировок, битбакет был ленив при написании документации. Я работаю одновременно над этой проблемой и приближаюсь к чему-то, что похоже на вашу помощь, поэтому я считаю, что вы правы. Моя проблема заключалась в доступе к элементам в массиве, и я думаю, вы прибили его. –

 Смежные вопросы

  • Нет связанных вопросов^_^