3

Python/GTKアプリケーションでRedditAPIにPRAWを使用しています。APIの使用に成功しましたが、使用するためにJSONをデコードできないようです。私はPythonおよびGTKアプリケーションの初心者であることを知っておく必要があります。

# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
### BEGIN LICENSE
# This file is in the public domain
### END LICENSE

import gettext
from gettext import gettext as _
gettext.textdomain('redditreader')

from gi.repository import Gtk # pylint: disable=E0611
import logging
logger = logging.getLogger('redditreader')

from redditreader_lib import Window
from redditreader.AboutRedditreaderDialog import AboutRedditreaderDialog
from redditreader.PreferencesRedditreaderDialog import PreferencesRedditreaderDialog

import praw

import json
import simplejson
from pprint import pprint

# See redditreader_lib.Window.py for more details about how this class works
class RedditreaderWindow(Window):
    __gtype_name__ = "RedditreaderWindow"

    def finish_initializing(self, builder): # pylint: disable=E1002
        """Set up the main window"""
        super(RedditreaderWindow, self).finish_initializing(builder)

        self.AboutDialog = AboutRedditreaderDialog
        self.PreferencesDialog = PreferencesRedditreaderDialog

        # Code for other initialization actions should be added here.
r = praw.Reddit(user_agent='example')
try:
    submissions = r.get_front_page(limit=5)
    [str(x) for x in submissions]
    jsondatafirst = simplejson.loads(str(submissions))
    jsondata = unicode(jsondatafirst, 'utf-8')
    print(jsondata)
except (simplejson.decoder.JSONDecodeError, ValueError):
    print 'Decoding JSON has failed'
4

2 に答える 2

3

PRAWを使用すると、PRAWがすべてを処理するため、jsonデコードを行う必要はありません。

たとえば、提出物ごとに、賛成票の数、反対票の数、および提出物のタイトルを印刷するとします。あなたができること:

for submission in r.get_front_page(limit=5):
    print submission.ups, submission.downs, submission.title

送信オブジェクトで使用できるすべての属性を確認する場合は、次を実行できます。

import pprint
for submission in r.get_front_page(limit=5):
    pprint.pprint(vars(submission))

さらに、提出物からコメントを取得したい場合は、submission.commentsプロパティを使用できます。リクエストのjson応答を手動で調べて、PRAWで使用できる属性を確認することもできます(

属性は、リクエストに関連付けられたjson応答にあるキー名から直接作成されるため、オブジェクトのどこにも明示的にリストされていません。

于 2012-10-05T02:18:52.427 に答える
2

JSONは単に辞書の辞書であり、必要に応じてリストで拡張されます。

現在扱っているJSONに慣れるための良い方法は、JSONをロードし、より簡単な方法でディクショナリ要素にアクセスして試してみることです。

>>> import urllib2
>>> import json
>>> response = urllib2.urlopen('http://reddit.com/user/droogans.json').read()
>>> js = json.loads(response)
>>> comment = js['data']['children'][0]['data']
>>> #this is my most recent comment, along with a lot of other interesting stuff
>>> print comment['ups']
9001

したがって、データを調べれば、データをよりよく理解できます。

于 2012-10-04T02:45:38.653 に答える