Python Json은 사전 대신 문자열을 반환()합니까?
Python 3의 내장 JSON 모듈을 사용하여 간단한 JSON 파싱을 하려고 합니다. SO와 구글링에 대한 많은 다른 질문들을 읽어보면 이것이 매우 간단할 것 같습니다.하지만 예상한 사전이 아닌 문자열이 반환되는 것 같습니다.
먼저 제가 가치를 얻고자 하는 JSON입니다.Twitter API의 출력일 뿐입니다.
[{'in_reply_to_status_id_str': None, 'in_reply_to_screen_name': None, 'retweeted': False, 'in_reply_to_status_id': None, 'contributors': None, 'favorite_count': 0, 'in_reply_to_user_id': None, 'coordinates': None, 'source': '<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>', 'geo': None, 'retweet_count': 0, 'text': 'Tweeting a url \nhttp://t.co/QDVYv6bV90', 'created_at': 'Mon Sep 01 19:36:25 +0000 2014', 'entities': {'symbols': [], 'user_mentions': [], 'urls': [{'expanded_url': 'http://www.isthereanappthat.com', 'display_url': 'isthereanappthat.com', 'url': 'http://t.co/QDVYv6bV90', 'indices': [16, 38]}], 'hashtags': []}, 'id_str': '506526005943865344', 'in_reply_to_user_id_str': None, 'truncated': False, 'favorited': False, 'lang': 'en', 'possibly_sensitive': False, 'id': 506526005943865344, 'user': {'profile_text_color': '333333', 'time_zone': None, 'entities': {'description': {'urls': []}}, 'url': None, 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'protected': False, 'default_profile_image': True, 'utc_offset': None, 'default_profile': True, 'screen_name': 'KickzWatch', 'follow_request_sent': False, 'following': False, 'profile_background_color': 'C0DEED', 'notifications': False, 'description': '', 'profile_sidebar_border_color': 'C0DEED', 'geo_enabled': False, 'verified': False, 'friends_count': 40, 'created_at': 'Mon Sep 01 16:29:18 +0000 2014', 'is_translator': False, 'profile_sidebar_fill_color': 'DDEEF6', 'statuses_count': 4, 'location': '', 'id_str': '2784389341', 'followers_count': 4, 'favourites_count': 0, 'contributors_enabled': False, 'is_translation_enabled': False, 'lang': 'en', 'profile_image_url': 'http://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png', 'profile_image_url_https': 'https://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png', 'id': 2784389341, 'profile_use_background_image': True, 'listed_count': 0, 'profile_background_tile': False, 'name': 'Maktub Destiny', 'profile_link_color': '0084B4'}, 'place': None}]
이 String을 json_string이라는 변수에 다음과 같이 할당했습니다.
json_string = json.dumps(output)
jason = json.loads(json_string)
그런 다음 "jason" 사전에서 특정 키를 가져오려고 하면 다음과 같이 됩니다.
print(jason['hashtags'])
에러가 표시된다.
TypeError: string indices must be integers
json 출력을 사전으로 변환한 후jason[key_name]
호출하여 지정된 키를 사용하여 값을 가져옵니다.제가 놓친 게 있나요?
자바에서 온 후 Python으로 작업하는 것은 이번이 처음입니다.나는 그 언어를 정말 좋아하고 그것이 매우 강력하다고 생각한다.그러니 어떤 도움이라도 주시면 감사하겠습니다!
네, 먼저 오브젝트를 인쇄하여 읽을 수 있도록 해야 합니다.
>>> from pprint import pprint
>>> output = [{'in_reply_to_status_id_str': None, 'in_reply_to_screen_name': None, 'retweeted': False, 'in_reply_to_status_id': None, 'contributors': None, 'favorite_count': 0, 'in_reply_to_user_id': None, 'coordinates': None, 'source': '<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>', 'geo': None, 'retweet_count': 0, 'text': 'Tweeting a url \nhttp://t.co/QDVYv6bV90', 'created_at': 'Mon Sep 01 19:36:25 +0000 2014', 'entities': {'symbols': [], 'user_mentions': [], 'urls': [{'expanded_url': 'http://www.isthereanappthat.com', 'display_url': 'isthereanappthat.com', 'url': 'http://t.co/QDVYv6bV90', 'indices': [16, 38]}], 'hashtags': []}, 'id_str': '506526005943865344', 'in_reply_to_user_id_str': None, 'truncated': False, 'favorited': False, 'lang': 'en', 'possibly_sensitive': False, 'id': 506526005943865344, 'user': {'profile_text_color': '333333', 'time_zone': None, 'entities': {'description': {'urls': []}}, 'url': None, 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'protected': False, 'default_profile_image': True, 'utc_offset': None, 'default_profile': True, 'screen_name': 'KickzWatch', 'follow_request_sent': False, 'following': False, 'profile_background_color': 'C0DEED', 'notifications': False, 'description': '', 'profile_sidebar_border_color': 'C0DEED', 'geo_enabled': False, 'verified': False, 'friends_count': 40, 'created_at': 'Mon Sep 01 16:29:18 +0000 2014', 'is_translator': False, 'profile_sidebar_fill_color': 'DDEEF6', 'statuses_count': 4, 'location': '', 'id_str': '2784389341', 'followers_count': 4, 'favourites_count': 0, 'contributors_enabled': False, 'is_translation_enabled': False, 'lang': 'en', 'profile_image_url': 'http://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png', 'profile_image_url_https': 'https://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png', 'id': 2784389341, 'profile_use_background_image': True, 'listed_count': 0, 'profile_background_tile': False, 'name': 'Maktub Destiny', 'profile_link_color': '0084B4'}, 'place': None}]
>>> pprint(output)
[{'contributors': None,
'coordinates': None,
'created_at': 'Mon Sep 01 19:36:25 +0000 2014',
'entities': {'hashtags': [],
'symbols': [],
'urls': [{'display_url': 'isthereanappthat.com',
'expanded_url': 'http://www.isthereanappthat.com',
'indices': [16, 38],
'url': 'http://t.co/QDVYv6bV90'}],
'user_mentions': []},
'favorite_count': 0,
'favorited': False,
'geo': None,
'id': 506526005943865344,
'id_str': '506526005943865344',
'in_reply_to_screen_name': None,
'in_reply_to_status_id': None,
'in_reply_to_status_id_str': None,
'in_reply_to_user_id': None,
'in_reply_to_user_id_str': None,
'lang': 'en',
'place': None,
'possibly_sensitive': False,
'retweet_count': 0,
'retweeted': False,
'source': '<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>',
'text': 'Tweeting a url \nhttp://t.co/QDVYv6bV90',
'truncated': False,
'user': {'contributors_enabled': False,
'created_at': 'Mon Sep 01 16:29:18 +0000 2014',
'default_profile': True,
'default_profile_image': True,
'description': '',
'entities': {'description': {'urls': []}},
'favourites_count': 0,
'follow_request_sent': False,
'followers_count': 4,
'following': False,
'friends_count': 40,
'geo_enabled': False,
'id': 2784389341,
'id_str': '2784389341',
'is_translation_enabled': False,
'is_translator': False,
'lang': 'en',
'listed_count': 0,
'location': '',
'name': 'Maktub Destiny',
'notifications': False,
'profile_background_color': 'C0DEED',
'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png',
'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png',
'profile_background_tile': False,
'profile_image_url': 'http://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png',
'profile_image_url_https': 'https://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png',
'profile_link_color': '0084B4',
'profile_sidebar_border_color': 'C0DEED',
'profile_sidebar_fill_color': 'DDEEF6',
'profile_text_color': '333333',
'profile_use_background_image': True,
'protected': False,
'screen_name': 'KickzWatch',
'statuses_count': 4,
'time_zone': None,
'url': None,
'utc_offset': None,
'verified': False}}]
이것을 보면, 출력이list
그 안에 싱글이 들어있다.dict
이 기능에 액세스 하려면 , 다음의 조작이 필요합니다.
>>> first_elem = output[0]
또 다른 것은,hashtags
키를 누르다first_elem
두 번째 레벨에 포함되어 있다dict
비밀리에entities
:
>>> entities = first_elem['entities']
>>> pprint(entities)
{'hashtags': [],
'symbols': [],
'urls': [{'display_url': 'isthereanappthat.com',
'expanded_url': 'http://www.isthereanappthat.com',
'indices': [16, 38],
'url': 'http://t.co/QDVYv6bV90'}],
'user_mentions': []}
이것으로, 에 액세스 할 수 있게 되었습니다.hashtags
:
>>> entities['hashtags']
[]
공교롭게도 빈 명단이네요
JSON으로 변환하려면 코멘트에 주의해 주세요.
>>> import json
>>> # Make sure output is the list object not a string representing the object
>>> json_string = json.dumps(output)
>>> jason = json.loads(output)
>>> jason[0]['entities']['hashtags']
[]
내 생각에 당신의 문제는 당신이 먼저 출력을 문자열로 만든 것 같아요.json.dumps
즉,json.loads
는 json 객체가 아닌 문자열을 반환합니다.
그리고 @Dan의 답변은 맞지만 이것은 유효한 JSON이 아닙니다.그러나 이것은 유효한 python dict이며, 나는 당신이 python을 사용하여 트위터에서 그것을 얻어서 인쇄했을 것이라고 생각한다.
했다json.loads(json.loads(string))
사전을 구할 수 있었습니다.확인하실 수 있습니다.처음 동일한 문자열을 반환할 뿐만 아니라 해당 문자열을 처리합니다(예: 제거).\\
문자)를 참조해 주세요.
우선, JSON의 예는 유효한 JSON이 아닙니다.Twitter API는 모든 JSON 컨슈머를 파괴하기 때문에 이것을 출력하지 않습니다.
- jsonlint는 첫 번째 명백한 구문 오류를 나타냅니다.즉, 이중 따옴표로 묶인 문자열이 아닌 단일 문자열입니다.
- 두 번째로,
None
JSON이 필요로 하는 경우null
,False
false
, , , , 입니다.True
「」가 아닌 「」true
.
당신이 주장하는 "JSON" 예는 Python :)에 미리 디코딩된 것으로 보입니다.실제 JSON의 일부를 사용하면 예상대로 동작합니다.
import json
json_string = r"""
[{"actual_json_key":"actual_json_value"}]
"""
jason = json.loads(json_string)
print(jason[0]["actual_json_key"])
언급URL : https://stackoverflow.com/questions/25613565/python-json-loads-returning-string-instead-of-dictionary
'bestsource' 카테고리의 다른 글
범위 간의 차이는 무엇입니까?{} 및 범위: true inside 디렉티브? (0) | 2023.02.23 |
---|---|
AngularJs UI 라우터 - 여러 URL이 있는 하나의 상태 (0) | 2023.02.23 |
입력되지 않은 npm 모듈에 대한 TypeScript 사용자 지정 선언 파일 (0) | 2023.02.23 |
Wordpress 다중 사이트 설치(3.0)에서 모든 블로그 옵션 테이블을 동시에 쿼리하려면 어떻게 해야 합니까? (0) | 2023.02.23 |
테이블에서 TOP N 행을 선택합니다. (0) | 2023.02.23 |