如何在 Python 中检查字符串是否为有效的 JSON?
在Python中,有没有办法在尝试解析字符串之前检查它是否是有效的JSON?
例如,使用 Facebook Graph API 之类的东西,有时它会返回 JSON,有时它可能会返回图像文件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在Python中,有没有办法在尝试解析字符串之前检查它是否是有效的JSON?
例如,使用 Facebook Graph API 之类的东西,有时它会返回 JSON,有时它可能会返回图像文件。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(8)
您可以尝试执行
json.loads()
,如果您传递的字符串无法解码为JSON,它将抛出ValueError
。一般来说,针对这种情况的“Pythonic”哲学被称为EAFP,因为请求宽恕比请求许可更容易。
You can try to do
json.loads()
, which will throw aValueError
if the string you pass can't be decoded as JSON.In general, the "Pythonic" philosophy for this kind of situation is called EAFP, for Easier to Ask for Forgiveness than Permission.
如果字符串是有效的 json,示例 Python 脚本将返回一个布尔值:
其中打印:
将 JSON 字符串转换为 Python 字典:
将 python 对象转换为 JSON 字符串:
如果需要访问低级解析,不要自己动手,使用现有的库: http://www.json.org /
关于 python JSON 模块的精彩教程:https://pymotw.com/2/json/
是字符串 JSON 并显示语法错误和错误消息:
打印:
json_xs
能够进行语法检查、解析、压缩、编码、解码等:https://metacpan.org/pod/json_xs
Example Python script returns a boolean if a string is valid json:
Which prints:
Convert a JSON string to a Python dictionary:
Convert a python object to JSON string:
If you want access to low-level parsing, don't roll your own, use an existing library: http://www.json.org/
Great tutorial on python JSON module: https://pymotw.com/2/json/
Is String JSON and show syntax errors and error messages:
Prints:
json_xs
is capable of syntax checking, parsing, prittifying, encoding, decoding and more:https://metacpan.org/pod/json_xs
我想说的是,解析它是你真正能够完全分辨的唯一方法。如果格式不正确,Python 的 json.loads() 函数(几乎肯定)会引发异常。但是,您示例的目的可能只是检查前几个非空白字符...
我不熟悉 facebook 发回的 JSON,但来自 Web 应用程序的大多数 JSON 字符串将以空心方块开头
[
或大括号{
。据我所知,没有任何图像格式以这些字符开头。相反,如果您知道可能显示哪些图像格式,则可以检查字符串的开头以获取其签名来识别图像,如果不是图像,则假设您有 JSON。
识别图形而不是文本字符串的另一个简单技巧是,如果您正在寻找图形,则只需测试字符串的前几十个字符中的非 ASCII 字符(假设 JSON 是 ASCII )。
I would say parsing it is the only way you can really entirely tell. Exception will be raised by python's
json.loads()
function (almost certainly) if not the correct format. However, the the purposes of your example you can probably just check the first couple of non-whitespace characters...I'm not familiar with the JSON that facebook sends back, but most JSON strings from web apps will start with a open square
[
or curly{
bracket. No images formats I know of start with those characters.Conversely if you know what image formats might show up, you can check the start of the string for their signatures to identify images, and assume you have JSON if it's not an image.
Another simple hack to identify a graphic, rather than a text string, in the case you're looking for a graphic, is just to test for non-ASCII characters in the first couple of dozen characters of the string (assuming the JSON is ASCII).
我还使用 json.loads() 来检查字符串是否是有效的 JSON,但我还需要检查它是否是复杂的数据结构。例如,我不想将简单的字符串或整数保存到数据库......
这些也是有效的 JSON,但有时也必须进行过滤:
"\"valid json\""
"1"
"3.14"
My解决方案在这里:
I also used
json.loads()
to check if a string is a valid JSON, however I also needed to check if it is complex data structure or not. I did not want to save to the db a simple string or an integer for example...These are also valid JSON, but sometimes must be filter as well:
"\"valid json\""
"1"
"3.14"
My solution is here:
一种检查有效 JSON 的有效且可靠的方法。如果“get”访问器未抛出
AttributeError
,则 JSON 有效。使用时,我们调用该函数并查找密钥。
返回“真”
返回“假”
An effective, and reliable way to check for valid JSON. If the 'get' accessor does't throw an
AttributeError
then the JSON is valid.To use, we call the function and look for a key.
Returns 'True'
Returns 'False'
我想出了一个通用的、有趣的解决方案来解决这个问题:
你可以像这样使用它:
I came up with an generic, interesting solution to this problem:
and you can use it like so:
在我看来,
JSONDecodeError
是比ValueError
更好的选择。可以做类似的事情:
示例:
输出:
In my opinion,
JSONDecodeError
is much better option thanValueError
.Can do something like:
Example:
Output:
try 块中非常简单。然后您可以验证正文是否是有效的 JSON
Much simple in try block. You can then validate if the body is a valid JSON