【问题标题】:Parse server payload with few keys absent解析服务器有效负载,缺少几个键
【发布时间】:2020-05-03 07:24:24
【问题描述】:

我有一段相当基本的代码。基本上它所做的是将 API 请求发送到本地托管的服务器并返回 JSON 字符串。我把那根绳子拆开。然后我从中获取我需要的内容,制作一个字典,并将其导出为带有 nfo 扩展名的 XML 文件。

问题是有时会丢失源数据的位。例如,季节经常丢失。它破坏了数据映射。我需要一种方法来处理它。对于某些我可能想要排除数据的东西,对于其他我需要一个合理的默认值。

#!/bin/env python

import os
import requests
import re
import json
import dicttoxml
import xml.dom.minidom
from xml.dom.minidom import parseString
# Grab Shoko Auth Key

apiheaders = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
}

apidata = '{"user": "Default", "pass": "", "device": "CLI"}'

r = requests.post('http://192.168.254.100:8111/api/auth',
                  headers=apiheaders, data=apidata)
key = json.loads(r.text)['apikey']

# Grabbing Episode Data
EpisodeHeaders = {
    'accept': 'text/plain',
    'apikey': key
}

EpisodeParams = (
    ('filename',
     "FILE HERE"),
    ('pic', '1'),

)

fileinfo = requests.get(
    'http://192.168.254.100:8111/api/ep/getbyfilename', headers=EpisodeHeaders, params=EpisodeParams)

# Mapping Data from Shoko to Jellyfin NFO
string = json.loads(fileinfo.text)
print(string)
eplot = json.loads(fileinfo.text)['summary']
etitle = json.loads(fileinfo.text)['name']
eyear = json.loads(fileinfo.text)['year']
episode = json.loads(fileinfo.text)['epnumber']
season = json.loads(fileinfo.text)['season']
aid = json.loads(fileinfo.text)['aid']
seasonnum = season.split('x')

# Create Dictionary From Mapped Data

show = {
    "plot": eplot,
    "title": etitle,
    "year": eyear,
    "episode": episode,
    "season": seasonnum[0],
}

这是代码崩溃时的一些示例输出

{'type': 'ep', 'eptype': 'Credits', 'epnumber': 1, 'aid': 10713, 'eid': 167848, 
'id': 95272, 'name': 'Opening', 'summary': 'Episode Overview not Available', 
'year': '2014', 'air': '2014-11-23', 'rating': '10.00', 'votes': '1', 
'art': {'fanart': [{'url': '/api/v2/image/support/plex_404.png'}], 
'thumb': [{'url': '/api/v2/image/support/plex_404.png'}]}}
Traceback (most recent call last):
  File "/home/fletcher/Documents/Shoko-Jellyfin-NFO/Xml3.py", line 48, in <module>
    season = json.loads(fileinfo.text)['season']
KeyError: 'season'

基于 Mahori 建议的解决方案。完美运行。

eplot = json.loads(fileinfo.text).get('summary', None)
etitle = json.loads(fileinfo.text).get('name', None)
eyear = json.loads(fileinfo.text).get('year', None)
episode = json.loads(fileinfo.text).get('epnumber', None)
season = json.loads(fileinfo.text).get('season', '1x1')
aid = json.loads(fileinfo.text).get('aid', None)

【问题讨论】:

  • 您愿意缩小您的代码范围并缩小问题范围吗?你有什么错误吗?被认为是默认字典?
  • 我很抱歉。问题在于数据映射。当它试图提取一个不存在的值时,它就会崩溃。我将提供一个错误示例。
  • 您可以将字典存储在变量中,然后使用if ‘season’ in mydict:mydict.getdefault(‘season’,’no soeason’)

标签: python json xml metadata


【解决方案1】:

这是 Web 开发中相当常见的场景,您不能总是假设其他方会发送所有密钥。

解决此问题的标准方法是使用 get 而不是命名 fetch。

season = json.loads(fileinfo.text).get('season', None)
#you can change None to any default value here

【讨论】:

  • 哦,太棒了。这正是我本赛季所需要的。我可以为其他任何东西分配一个空值吗?
  • 嗯,这取决于。当然,您可以分配任何东西,而不仅仅是无。但实际值将来自您的业务逻辑。例如。有时您可能希望返回空列表,有时返回默认整数值等。
  • 在这种情况下,“无”可能会正常工作,因为 NFO 导入器并不希望每个值都存在。我只是想尽可能地提取所有数据,以简化稍后导入的数据。由于我必须解析初始原始数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2016-12-27
相关资源
最近更新 更多