错误:无法解码JSON对象

时间:2017-08-01 09:35:06

标签: python

这是我创建的智能镜像中的天气代码。我正在使用其他人的代码,并在运行应用程序时遇到这两个错误(应用程序工作它只是不显示天气):

  1. ValueError:无法解码JSON对象
  2. 错误:无法解码JSON对象。无法得到天气

    def get_weather(self):
        try:
    
        if latitude is None and longitude is None:
            # get location
            location_req_url = "http://freegeoip.net/json/%s" % self.get_ip()
            r = requests.get(location_req_url)
            location_obj = json.loads(r.text)
    
            lat = location_obj['latitude']
            lon = location_obj['longitude']
    
            location2 = "%s, %s" % (location_obj['city'], location_obj['region_code'])
    
            # get weather
            weather_req_url = "https://api.darksky.net/forecast/%s/%s,%s?lang=%s&units=%s" % (weather_api_token, lat,lon,weather_lang,weather_unit)
        else:
            location2 = ""
            # get weather
            weather_req_url = "https://api.darksky.net/forecast/%s/%s,%s?lang=%s&units=%s" % (weather_api_token, latitude, longitude, weather_lang, weather_unit)
    
        r = requests.get(weather_req_url)
        weather_obj = json.loads(r.text)
    
        degree_sign= u'\N{DEGREE SIGN}'
        temperature2 = "%s%s" % (str(int(weather_obj['currently']['temperature'])), degree_sign)
        currently2 = weather_obj['currently']['summary']
        forecast2 = weather_obj["hourly"]["summary"]
    
        icon_id = weather_obj['currently']['icon']
        icon2 = None
    
        if icon_id in icon_lookup:
            icon2 = icon_lookup[icon_id]
    
        if icon2 is not None:
            if self.icon != icon2:
                self.icon = icon2
                image = Image.open(icon2)
                image = image.resize((100, 100), Image.ANTIALIAS)
                image = image.convert('RGB')
                photo = ImageTk.PhotoImage(image)
    
                self.iconLbl.config(image=photo)
                self.iconLbl.image = photo
        else:
            # remove image
            self.iconLbl.config(image='')
    
        if self.currently != currently2:
            self.currently = currently2
            self.currentlyLbl.config(text=currently2)
        if self.forecast != forecast2:
            self.forecast = forecast2
            self.forecastLbl.config(text=forecast2)
        if self.temperature != temperature2:
            self.temperature = temperature2
            self.temperatureLbl.config(text=temperature2)
        if self.location != location2:
            if location2 == ", ":
                self.location = "Cannot Pinpoint Location"
                self.locationLbl.config(text="Cannot Pinpoint Location")
            else:
                self.location = location2
                self.locationLbl.config(text=location2)
    except Exception as e:
        traceback.print_exc()
        print( "Error: %s. Cannot get weather." % e)
    
    self.after(600000, self.get_weather)
    
    @staticmethod
    def convert_kelvin_to_fahrenheit(kelvin_temp):
        return 1.8 * (kelvin_temp - 273) + 32
    
  3. 这是应用中天气小部件的代码。我使用的模块是:

    from tkinter import *
    import locale
    import threading
    import time
    import requests
    import json
    import traceback
    import feedparser
    
    from PIL import Image, ImageTk
    from contextlib import contextmanager
    

    所以这些是正在使用的模块。

1 个答案:

答案 0 :(得分:0)

好的,经过这么长时间的尝试,我发现即使api令牌打印404意味着它被禁止,它也不会改变输出错误的代码部分:

weather_req_url = "https://api.darksky.net/forecast/%s/%s,%s?lang=%s&units=%s" % (weather_api_token, latitude, longitude, weather_lang, weather_unit)

应该是:

weather_req_url = "%s/%s,%s?lang=%s&units=%s" % (weather_api_token, latitude, longitude, weather_lang, weather_unit)

这是因为我的api密钥应该是一个链接,所以“(https)://api.darksky.net/forecast/”

所以我把它从weather_req_url

中取出来了

N.B。 https in'()'因此它不会形成可点击的链接