2017-07-17 155 views
0

我尝试了所有我发现了这样的方法没有一个是有问题的工作对我来说检查是否JSON值为空

的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”因为我希望编译器试图转换字符串。为什么“不是None”不适用于空的json字符串?

回答

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()将返回任何内容,但试图将其与字符串标题一起产生错误。

我通过返回一个空字符串来解决这个问题。

0

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

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

通常,['gmetadata'] [0] ['title_jpn']是一个unicode字符串。偶尔没有提供名称,因此JSON值将被设置为“”。我如何检查是否给出了该值? – siryx

+0

当我尝试使用你的代码时,我得到“错误:'dict'对象没有属性'find'” – siryx

+1

@siryx听起来像你正在使用没有'.find()'方法的老版本的python 。 – Soviut

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'): 
+0

是来自解析的空字符串保证被内化? '不是'“'对我气味不好:( – viraptor

+0

@viraptor我已经更新了答案,以包含python中虚假字符串的解释 – Soviut

+0

你是对的,但错误位于其他地方:) – siryx