检查json值是否为空

时间:2017-07-17 01:04:57

标签: python json

我尝试了我在SO上找到的所有方法,但没有一个对我有用

有问题的JSON(修剪过)

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

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

该字符串是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_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字符串?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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_jpn可能是可选的并且不总是存在的事实,你需要在你的if语句中做两个条件(我认为这是你最初想要做的) :

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

上述行首先检查title_jpn键是否存在,然后再尝试检查其值是否为空。这可以使用字典.get()方法进一步简化,该方法允许您提供默认值。

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

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

  

dict.get(key,default = None)

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

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

答案 2 :(得分:0)

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

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()将不返回任何内容,但尝试用字符串标题来表示它会产生错误。

我通过在if未被击中时返回空字符串来修复此问题。