Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中检查字符串是否为有效的JSON?_Python_Json - Fatal编程技术网

如何在Python中检查字符串是否为有效的JSON?

如何在Python中检查字符串是否为有效的JSON?,python,json,Python,Json,在Python中,有没有一种方法可以在解析字符串之前检查它是否是有效的JSON 例如,使用Facebook Graph API,有时返回JSON,有时返回图像文件。您可以尝试执行JSON.loads(),如果传递的字符串无法解码为JSON,则会抛出ValueError 一般来说,这种情况下的“哲学”被称为“请求原谅比允许更容易”。我想说,解析它是你真正能够完全分辨的唯一方法。如果格式不正确,python的json.loads()函数(几乎可以肯定)将引发异常。但是,出于示例的目的,您可能只需检查

在Python中,有没有一种方法可以在解析字符串之前检查它是否是有效的JSON


例如,使用Facebook Graph API,有时返回JSON,有时返回图像文件。

您可以尝试执行
JSON.loads()
,如果传递的字符串无法解码为JSON,则会抛出
ValueError


一般来说,这种情况下的“哲学”被称为“请求原谅比允许更容易”。我想说,解析它是你真正能够完全分辨的唯一方法。如果格式不正确,python的
json.loads()
函数(几乎可以肯定)将引发异常。但是,出于示例的目的,您可能只需检查前两个非空白字符

我不熟悉facebook发回的JSON,但是大多数来自web应用程序的JSON字符串都会以一个开放的方形
[
或卷曲的
{
括号开头。据我所知,没有图像格式是以这些字符开头的

相反,如果您知道可能会显示哪些图像格式,则可以检查字符串开头的签名以识别图像,如果不是图像,则假设您有JSON

另一种识别图形而不是文本字符串的简单方法是,如果您正在查找图形,只需测试字符串前几十个字符中的非ASCII字符(假设JSON是ASCII)。

如果字符串是有效的JSON,示例Python脚本将返回布尔值: 其中打印:

print is_json("{}")                          #prints True
print is_json("{asdf}")                      #prints False
print is_json('{ "age":100}')                #prints True
print is_json("{'age':100 }")                #prints False
print is_json("{\"age\":100 }")              #prints True
print is_json('{"age":100 }')                #prints True
print is_json('{"foo":[5,6.8],"foo":"bar"}') #prints True
将JSON字符串转换为Python字典:

import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo'])    #prints bar

mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo))           #prints {"gummy": "bear"}
将python对象转换为JSON字符串:

import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo'])    #prints bar

mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo))           #prints {"gummy": "bear"}
如果您希望访问低级解析,请不要使用自己的,请使用现有库:

关于python JSON模块的精彩教程:

是字符串JSON,显示语法错误和错误消息: sudo cpan JSON::XS echo'{“foo”:[5,6.8],“foo”:“bar”bar}>myjson.json json_xs-t none 印刷品:

, or } expected while parsing object/hash, at character offset 28 (before "bar}
at /usr/local/bin/json_xs line 183, <STDIN> line 1.
分析对象/哈希时,字符偏移量28处(在“bar”之前)应为,或} 在/usr/local/bin/jsonxs第183行,第1行。
json_xs
能够进行语法检查、解析、认证、编码、解码等:


我想出了一个通用的、有趣的解决方案:

class SafeInvocator(object):
    def __init__(self, module):
        self._module = module

    def _safe(self, func):
        def inner(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except:
                return None

        return inner

    def __getattr__(self, item):
        obj = getattr(self.module, item)
        return self._safe(obj) if hasattr(obj, '__call__') else obj
您可以这样使用它:

safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
    # do something

try块非常简单。然后可以验证主体是否是有效的JSON

async def get_body(request: Request):
try:
    body = await request.json()
except:
    body = await request.body()
return body

api应该设置内容类型。你不能指定api调用中返回的数据是什么?我不熟悉Facebook api,但听起来真的很奇怪。我做过一次,但大多数响应都是json,但是,如果你调用配置文件照片,它只返回jpgI,可以看到这将如何工作。这就引出我的下一个问题。它抛出ValueError。此时我希望它做的是返回有问题的字符串,以便我可以对其执行其他操作。到目前为止,我只收到了错误消息并键入了错误。只返回传递给except子句中加载的字符串有什么问题?没有问题,只是我犯了一个noob错误。似乎我无法调用file.read()两次。但我可以设置一个变量并使用它。这就是我所做的。只需注意……json.load('10')不会抛出ValueError,而且我确信'10'不是有效的json……尽管规范规定json文本必须是数组或对象,但大多数编码器和解码器(包括Python)都会同时处理任何json值。”顶部"包括数字和字符串。
10
是一个有效的JSON数字值。我认为一般的解决方案是好的,但在这种情况下,
except
子句可能隐藏任何严重的异常。捕获异常必须尽可能严格。你认为一旦验证,我们应该
del JSON\u object
吗?为什么没有一个适当的解决方案验证方法?应该有一种在不杀死金丝雀的情况下进行错误检查的方法。我的意思是:仅仅因为Python允许OO并不意味着可以忽略其他部分。我应该有两种选择:a.让函数失败并使用异常(OO/Python方式),或者B.调用返回值的函数(成功或错误)而不是抛出异常,然后让我的函数返回一个指示错误的前哨值,这样错误会在调用栈中鼓起,并可以被用作必要的(过程/ C方式)。就像C++不强迫你使用异常(你可以使用ErnO)一样。,Python不应该强迫它,either@BradenBestJSON字符串验证一直困扰着这个让暂停问题变得有趣的恶魔。除了使用解析器尝试字符串并查看它是否完成无误之外,没有数学上正确的方法来证明字符串的正确性。要了解为什么很难:“给我写一个程序,证明计算机程序中不存在语法错误"这是不可能的。语言开发人员会对编码和解码的永恒军备竞赛诗意地渲染。如果一个字符串对于一个给定的引擎来说是有效的,最好的办法是返回“是”/“否”。“EricLeschinski,但是这里没有一个停顿的问题。如果PAR发生错误,程序显然会引发异常。使用JSON。因此,程序知道什么时候JSON输入无效。因此,有一个函数可以检查输入是否有效,而不必使用
try
。#stopcanary滥用