3

私は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.
4

2 に答える 2

8

ast.literal_evalネストされた辞書には問題はありません。

>>> ast.literal_eval("{'a': {'b':'c'}}")
{'a': {'b': 'c'}}

ast.literal_evalデータが実際にはJSONであるため、壊れています…そしてJSONは有効なPythonではありません。具体的にnullは、は有効なPythonリテラルではありません。

json.loads()データをロードするためだけに使用しないのはなぜですか?

于 2012-06-07T02:45:32.990 に答える
0

私はパンダでjson.normalizeを使用したいが、値がstrタイプであるという1つのシナリオを思いつきました。ast.literal_evalを使用して、キャストを入力します

以下のようにast.literal_evalを使用できます--df[column_name]= df [column_name] .apply(ast.literal_eval)

これにより、strがdictに変換されます。たとえば。df = [{'A': "{'value': '1'}"、'B': "{'value': '2'}"}]

文字通りの評価を適用した後--df=[{'A':{'value': '1'}、'B':{'value': '2'}}]

于 2020-09-01T08:35:21.567 に答える