Python 检查json值是否为空
我尝试了所有我找到的方法,但是没有一种对我有效 正在讨论的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
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")