Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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,我尝试了所有我找到的方法,但是没有一种对我有效 正在讨论的JSON(已修剪) 字符串是curl-POST的输出http://api.example.com 这是我的方法: # TODO: (core) Don't print empty string for japanese title if none given @staticmethod def build_title_jpn_string(json_data): if 'title_jpn' in json_data['gmeta

我尝试了所有我找到的方法,但是没有一种对我有效

正在讨论的JSON(已修剪)

字符串是
curl-POST的输出http://api.example.com

这是我的方法:

# TODO: (core) Don't print empty string for japanese title if none given
@staticmethod
def build_title_jpn_string(json_data):
    if 'title_jpn' in json_data['gmetadata'][0] is not "":
        return 'Japanese Title: ' + pprint.pformat(json_data['gmetadata'][0]['title_jpn'])
我不希望它在['gmetadata'][0]['title\u jpn']为无时执行

我试过多种变体

    if 'title_jpn' in json_data['gmetadata'][0] is not "":
        return 'Japanese Title: ' + pprint.pformat(json_data['gmetadata'][0]['title_jpn'])
以及

    if 'title_jpn' in json_data['gmetadata'][0] is not None:
        return 'Japanese Title: ' + pprint.pformat(json_data['gmetadata'][0]['title_jpn'])

    if json_data['gmetadata'][0]['title_jpn'] is not None:
        return 'Japanese Title: ' + pprint.pformat(json_data['gmetadata'][0]['title_jpn'])

    if json_data['gmetadata'][0].get('title_jpn') is not None:
        return 'Japanese Title: ' + pprint.pformat(json_data['gmetadata'][0]['title_jpn'])


    if json_data['gmetadata'][0].get('title_jpn'):
        return 'Japanese Title: ' + pprint.pformat(json_data['gmetadata'][0]['title_jpn'])

大多数都会给我错误:“不能隐式地将'NoneType'对象转换为str”,因为我希望编译器正在尝试转换字符串。为什么对于空json字符串,“is not None”不起作用?

您的.get不起作用,因为这适用于字典。据我所知,“In”也不起作用,因为这是for循环的语法。可能您需要“”方法,因为它匹配较长字符串中的子字符串(如果我理解正确,这是您的目标)。如果找不到字符串,它将返回-1。因此,在您的案例中,请使用以下示例:

if json_data['gmetadata'][0].find('title_jpn') != -1:

您误解了中的
是如何工作的<在
中,检查键是否存在于字典中,它不会索引到字典中。这就是方括号的作用

if 'title_jpn' in json_data['gmetadata'][0] is not "":
上面这一行的计算结果与您预期的不一样。应该是

if json_data['gmetadata'][0]['title_jpn'] is not "":
这可以进一步简化,因为在python中空字符串
'
的计算结果总是
False
。因此,与其检查字符串是否为空,不如检查它是否有任何值,如下所示:

if json_data['gmetadata'][0]['title_jpn']:
如果您试图防止
title\u jpn
可能是可选的,并且不总是存在,那么您需要在If语句中执行两个条件(我认为这是您最初尝试执行的):

在尝试检查其值是否为空之前,上面的一行首先检查
title\u jpn
键是否存在。这可以使用字典方法进一步简化,字典方法允许您提供默认值

if json_data['gmetadata'][0].get('title_jpn', None):
上面将检查字典中是否有
title\u jpn
,如果有,则返回值;如果没有,则返回默认值
None
。由于在python中
None
被解释为
False
,因此if块将不会运行,这是所需的行为

dict.get(键,默认值=无)

但是,由于
.get()
会自动将默认值设置为
None
,因此只需执行以下操作即可

if json_data['gmetadata'][0].get('title_jpn'):

我的错误不在方法内部,而在外部。你不知道,因为我没有发布这个,但是

await self.pm.clientWrap.send_message(self.name, message_object.channel, self.build_title_string(
                json_data) + "\n" + self.build_title_jpn_string(json_data) + "\n")
正在产生错误
build\u title\u jpn\u string()
将返回none,但尝试将其与字符串标题关联会产生错误


我通过在未命中if时返回一个空字符串解决了这个问题。

解析产生的空字符串是否保证内部化
不是“”
对我来说很难闻:(@viraptor我已经更新了答案,包含了一个解释,说明python中的空字符串是错误的。你是对的,但错误在我的其他地方:)通常,['gmetadata'][0]['title\u jpn']是一个unicode字符串。有时没有提供名称,因此JSON值将设置为“”。如何检查该值是否给定?在尝试使用code@siryx听起来您使用的是一个旧版本的python,它没有
.find()
方法。我的python是3.5,但我回答了我的问题:)
if json_data['gmetadata'][0].get('title_jpn'):
await self.pm.clientWrap.send_message(self.name, message_object.channel, self.build_title_string(
                json_data) + "\n" + self.build_title_jpn_string(json_data) + "\n")