正在检查json值是否为空

2024-09-30 22:17:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试了所有的方法,但没有一个对我有效

有问题的JSON(trimmed)

json_data = requests.post(api_url, self.build_payload().json()

{
   "gmetadata":[
      {
         "title_jpn":"",
      }
   ]
}

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

这是我的方法:

^{pr2}$

我不希望它在['gmetadata'][0]['title_jpn']为None时执行。在

我试过多种变化

    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”,因为我认为编译器正在尝试转换字符串。为什么“is not None”对空json字符串不起作用?在


Tags: 字符串nonejsondatareturniftitleis
3条回答

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

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

您误解了in的工作原理。in检查字典中是否存在一个键,它不会将索引到字典中。这就是方括号的作用。在

if 'title_jpn' in json_data['gmetadata'][0] is not "":

上面的行不会像您期望的那样进行计算。应该是的。在

^{pr2}$

这可以进一步简化,因为在python中,空字符串''的值总是False。因此,不要检查字符串是否不为空,只需检查它是否有任何值,如下所示:

if json_data['gmetadata'][0]['title_jpn']:

如果您试图防止title_jpn可能是可选的并且不总是存在的,那么您需要在If语句中执行两个条件(我认为这正是您最初尝试的):

if 'title_jpn' in json_data['gmetadata'][0] and json_data['gmetadata'][0]['title_jpn']:

上面的行首先检查title_jpn键是否存在,然后再尝试检查它的值是否为空。使用dictionary ^{}方法可以进一步简化这一点,该方法允许您提供一个默认值。在

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

上面的代码将检查title_jpn是否在字典中,如果在字典中,则返回值;如果不在字典中,None作为默认值。由于在python中,None被解释为False,if块将不会运行,这是所需的行为。在

dict.get(key, default=None)

但是,由于.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_title_jpn_string()将返回none,但尝试将其与字符串标题相关,从而产生错误。在

我修复了这个问题,当if没有命中时返回一个空字符串。在

相关问题 更多 >