【问题标题】:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) When loopingjson.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 循环时
【发布时间】:2018-11-12 14:37:48
【问题描述】:
import requests
from bs4 import BeautifulSoup as bs4
from threading import Thread
import json
import time
from datetime import datetime
import _thread

webhook = ("https://hooks.slack.com/services/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")

s = requests.session()

payload={"channel": "#bot-monitor", "username": "Astro-bot", "text": "<https://www.astro-bot.io/astro/buyme-asdf-j4wrj-ypzkf|Astro Bot Restock! Click to Purchase>", "icon_emoji": ":rocket:"}


response = s.get('https://www.astro-bot.io/api/commerce/inventory/stock/?crumb=BQXy6KNmMGWENWE3YWQzMTc3MDU5NzE1ODdkNDNiM2RmZTEyNjg4&itemId=5b0dc9172b6a283905dabe08')
data = json.loads(response.text)
stock = data['results'][0]['qtyInStock']

def checkstock():
    response = s.get('https://www.astro-bot.io/api/commerce/inventory/stock/?crumb=BQXy6KNmMGWENWE3YWQzMTc3MDU5NzE1ODdkNDNiM2RmZTEyNjg4&itemId=5b0dc9172b6a283905dabe08')
    data = json.loads(response.text)
    stock = data['results'][0]['qtyInStock']
    print(stock)


def post():
    global stock
    if stock in [0]:
        print("Out of stock! LOL!")
        time.sleep(3)
        checkstock()

    else:
        if stock > (0):
        s.post(webhook, json=payload)


def main():
    checkstock()
    post()



if __name__ == '__main__':
    main()

代码运行一次,然后当它再次检查库存时,我得到:

从 None 提高 JSONDecodeError("Expecting value", s, err.value) json.decoder.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)。

请提出建议。

【问题讨论】:

  • 请在尝试以 JSON 格式加载之前向我们显示响应文本
  • 困惑的@cricket_007,你是什么意思
  • 请在每次尝试 json.loads(response.text) 之前将您的帖子编辑到 print(response.text)... 这将帮助您和我们调试问题(即您的 URL 并不总是返回完整的 JSON 正文)

标签: python json


【解决方案1】:

我努力保持礼貌,但代码的 sn-p 是这样一个反模式(全局、重复代码、函数外代码、不良流控制)的集合,因此几乎没有动力进行调试。你越早、越深入地重构代码,对你的项目就越好。

话虽如此,我认为较短的代码可以完成请求的任务,它没有JSONDecodeError

import requests
import time

ASTRO_URL = 'https://www.astro-bot.io/api/commerce/inventory/stock/?crumb=BQXy6KNmMGWENWE3YWQzMTc3MDU5NzE1ODdkNDNiM2RmZTEyNjg4&itemId=5b0dc9172b6a283905dabe08'
WEBHOOK_URL = 'https://hooks.slack.com/services/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'

def qty_in_stock(url):
    data = requests.get(url).json()
    return data['results'][0]['qtyInStock']    

def do_something():
    pass

def main():
    stock = qty_in_stock(ASTRO_URL)
    if stock == 0:
        print('out ot stock!')
        time.sleep(3)
        stock = qty_in_stock(ASTRO_URL)
        print(stock)
    else:
        do_something()

if __name__ == '__main__':
    main()

【讨论】:

  • 随机想一想,如果ASTRO_URL 是一个常量并且qty_in_stock 需要一个非常特殊的JSON 布局,那么可能没有必要将url 设为一个参数。无论如何,它永远不会是不同的 URL。
  • @Tomalak,您可能适合这个特定的用例。当我认为原始代码中使用了不同的网址时,我想出了url。直觉是您可能想阅读不同的网址,但对于这个非常具体的问题,您是对的。
  • @EvgenyPogrebnyak 对我需要做什么感到非常困惑
  • @drip man,你的意思是什么方向?完成你的例子,或者更好地构建你的代码?对于前者,您需要将 'do_something()' 更改为您的邮政编码,对于后者 - 尝试分析代码中的差异并避免使用全局变量。
  • @EvgenyPogrebnyak 我明白了,但我如何让它循环。关键是让它成为一个监视器并继续运行直到它看到库存
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多