【问题标题】:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0). answer rendring only for 10 charactersjson.decoder.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)。仅回答 10 个字符的渲染
【发布时间】:2020-11-01 20:52:23
【问题描述】:
@app.route('/api/<string:isbn>', methods = ['GET'])
def isbn(isbn):
#import api from Goodreads (stats)

    book_data = db.execute("SELECT * FROM books WHERE isbn=:isbn",{'isbn':isbn}).fetchone()
    title = book_data['title']
    author = book_data['author']
    year = book_data['year'] 


    res = requests.get("https://www.goodreads.com/book/review_counts.json", params={"key": "4RbGuzka0IUcJWWk1mivqg", "isbns":isbn }).json()

    reviews_count = float(res['books'][0]['reviews_count'])
    avg_score = float(res['books'][0]['average_rating'])
    dic = {"title": title, "author":author, "year": year,"isbn":isbn,"reviews_count":reviews_count,"avg_score":avg_score}
    print(dic)
    return jsonify(dic)

谁能告诉我这段代码有什么问题,当我指定 10 个字符的 isbn 数字时,它给了我正确的 api。当我指定的 isbn 编号少于 10 个字符时,我收到内部服务器错误:

 line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

【问题讨论】:

  • 没有不完全是 10 或 13 个字符的有效 ISBN。
  • isbn 编号存储在我的数据库中。一些是我在下面提到的
  • 那么您的数据库中有无效的 ISBN 编号。尝试在其他 ISBN 服务上查找这些号码,您就会看到。

标签: python json api flask raiseerror


【解决方案1】:
import requests
isbn = '1590388127'
result = requests.get("https://www.goodreads.com/book/review_counts.json",
                   params={"key": "4RbGuzka0IUcJWWk1mivqg", "isbns": isbn})

if result.status_code == 200:
    res = result.json()
else:  # print reason
    print(result.text)

上版本有效。但是,例如'756403146' 你会得到响应“'没有书籍与这些 ISBN 匹配。'”(在 result.text 中)。因此,isbn 不在数据库中。如果您尝试 .json() 这些响应的结果,则会收到您发布的错误消息。

【讨论】:

  • 对于存在的 isbn 号码也给出了错误,但我也想要他们的 api。请你能给我确切的代码来处理它。并且当我使用 if res.status_code != 404: raise Exception("ERROR: NOT FOUND.") 我在 isbn raise Exception("ERROR: NOT FOUND.") 中收到类似于第 135 行的错误 Exception: ERROR:未找到。
  • 1590388127,1423160924,048641423X,5559609129 这些是一些可以正常工作的。而 756403146,307265781,20306652 这些是少数无法使用的;但它应该工作。这些不到 10 个字符,它没有响应..
  • isbn 编号已在数据库中。我查过了。
【解决方案2】:

in a comment 发布的您无法上班的 ISBN 编号上进行谷歌搜索,发现它们似乎错误地删除了前导零。 (许多 ISBN 代码看起来像数字,但最后一个字符通常是字母符号,因此您应该无法将它们作为整数值处理。)

尝试用前导零填充,这样代码的长度总是正好为 10 或 13 个字符;任何其他长度都不是有效的 ISBN。

可能在实际数据库中解决此问题,或者更好的是,在您的数据库中提供信息的任何来源中;您不希望今后不得不处理此类损坏的数据。

【讨论】:

  • 您的问题应正确包含您提供的所有信息; cmets 可以而且经常应该被删除。也许您仍想更新您的问题以使其独立。
  • 如果您的数据库架构要求 ISBN 字段为 int,您可能会拒绝大量有效的 ISBN:s 作为键约束违规。如果可以的话,也可以回去修复它。
  • 在数据库中它的字符类型不同。这些是我从goodread那里得到的isbn号码。我只是将它们导入我的数据库。在它们前面加零不会错
猜你喜欢
  • 2016-03-03
  • 2020-01-02
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2021-04-27
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多