我尝试了我在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字符串?
答案 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未被击中时返回空字符串来修复此问题。