私はast.literal_evalを使用して、json.loads()から受け取ったデータをPythonディクショナリに変更しています。ただし、これをまったく別の方法で行う必要がある場合は、それも自由に指摘してください。
# Authentication
buf = StringIO.StringIO()
c = pycurl.Curl()
c.setopt(c.URL, "https://kippt.com/api/account")
c.setopt(c.WRITEFUNCTION, buf.write)
c.setopt(c.HTTPHEADER, header)
c.perform()
result = buf.getvalue()
buf.close()
print result
# Printing Output
data_string = json.dumps(result)
jsonload = json.loads(data_string)
jsondict = ast.literal_eval(jsonload)
現在、1行のJSONリターンで適切に機能します。例:
{"username": "my_username"、 "api_token": "my_api_token"}
そして私は値を正しく得ることができます:
print jsondict['username']
print jsondict['api_token']
私が問題を抱えているのは、次のようにデータがネストされている場合です。
{"meta":{"next":null、 "total_count":6、 "previous":null、 "limit":20、 "offset":0}、 "objects":[{"rss_url": "https: //kippt.com/feed/username_here/stuff_here/cool-stuff "、" update ":" 1339003710 "、" title ":" Cool Stuff "、" created ":" 1339001514 "、" slug ":" cool-stuff "、" id ":54533、" resource_uri ":" / api / lists / 54533 / "}、{" rss_url ":" https://kippt.com/feed/username_here/stuff_here/programming "、" update ": "1339003479"、 "title": "Programming"、 "created": "1339001487"、 "slug": "programming"、 "id":54532、 "resource_uri":"/ api / lists / 54532 /"}、{"rss_url": "https://kippt.com/feed/username_here/stuff_here/android"、 "updated": "1339003520"、 "title": "Android"、 "created": "1339000936"、 "slug": "android"、 "id":54530、 "resource_uri": "/ api / lists / 54530 /"}、{"rss_url": "https://kippt.com / feed / username_here / stuff_here / chrome "、" update ":" 1339000931"、" title ":" Chrome "、" created ":" 1339000412 "、" slug ":" chrome "、" id ":54529、" resource_uri ":" / api / lists / 54529 / "}、{" rss_url ":" https://kippt.com/feed/username_here/stuff_here/inbox "、"更新 ":"1338946730 "、" title ":" Inbox "、" created ":" 1338945940"、" slug ":" inbox "、" id ":54432、" resource_uri ":" / api / lists / 54432 / "}、{" rss_url ":" https://kippt.com/feed/username_here/stuff_here/read-later "、" update ":" 1338945940"、" title ":" Read Later "、" created ":" 1338945940"、" slug ":" read-later "、" id ":54433、" resource_uri ":" / api / lists / 54433 / "}]}com / feed / username_here / stuff_here / read-later "、" update ":" 1338945940"、" title ":" Read Later "、" created ":" 1338945940"、" slug ":" read-later "、" id ":54433、" resource_uri ":" / api / lists / 54433 / "}]}com / feed / username_here / stuff_here / read-later "、" update ":" 1338945940"、" title ":" Read Later "、" created ":" 1338945940"、" slug ":" read-later "、" id ":54433、" resource_uri ":" / api / lists / 54433 / "}]}
同じコード(/ api /listsのExchangeURL)を使用すると、スクリプトの実行時に次のエラーが発生します。
トレースバック(最後の最後の呼び出し):ファイル "kippt.py"、48行目、jsondict = ast.literal_eval(jsonload)ファイル "/usr/local/lib/python2.7/ast.py"、80行目、literal_eval return _convert(node_or_string)File "/usr/local/lib/python2.7/ast.py"、line 63、in _convert in zip(node.keys、node.values))File "/ usr / local / lib / python2 .7 / ast.py "、62行目、return dict((_ convert(k)、_convert(v))for k、vファイル" /usr/local/lib/python2.7/ast.py "、63行目、in _convert in zip(node.keys、node.values))ファイル "/usr/local/lib/python2.7/ast.py"、62行目、return dict((_ convert(k)、_convert(v) )for k、v File "/usr/local/lib/python2.7/ast.py"、line 79、in _convert raise ValueError('malformed string')ValueError:malformed string
どんな助けでもいただければ幸いです。ありがとう!
編集-以下の回答:
私の最初の入力はPython構文として解釈された可能性があるようです。これは、技術的にはそれでも最初から正しい方法で実行していなかったため、私の欠点でした。
以前行っていた厄介なことをするのではなく、cURLからの結果をjson.loads()したいだけです。
例えば:
buf = StringIO.StringIO()
c = pycurl.Curl()
c.setopt(c.URL, "https://kippt.com/api/lists")
c.setopt(c.WRITEFUNCTION, buf.write)
c.setopt(c.HTTPHEADER, header)
c.perform()
result = buf.getvalue()
buf.close()
print result
# Printing Output
jsonload = json.loads(result)
print jsonload['meta']['total_count'] # Gets the total_count item in the meta object.