#arrays #json #python-3.x
#массивы #json #python-3.x
Вопрос:
Мне предоставляется файл результатов JSON из какого-то скрипта, в котором, похоже, есть символы Юникода и некоторые необязательные поля, такие как «Десятичный». Я понятия не имею, что использовалось для создания отчета в формате JSON.
Файл JSON содержит более 2000 записей. Приведенный ниже пример содержит только первые две записи для простоты.
"{u'Count': 2119, u'Items': [{u'vlan': Decimal('2'), u'location': u'site1', u'vlan_name': u'vlan1'}, {u'vlan': Decimal('3'), u'location': u'site1', u'vlan_name': u'vlan3'}], u'ScannedCount': 2119, 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': 'UOH8U2E4THOGDHJ5BKODNS4I83VV4KQNSO5AEMVJF66Q9ASUAAJG', 'HTTPHeaders': {'x-amzn-requestid': 'UOH8U2E4THOGDHJ5BKODNS4I83VV4KQNSO5AEMVJF66Q9ASUAAJG', 'content-length': '209370', 'server': 'Server', 'connection': 'keep-alive', 'x-amz-crc32': '2084548256', 'date': 'Thu, 13 Aug 2020 18:14:21 GMT', 'content-type': 'application/x-amz-json-1.0'}}}"
Хотите распечатать или сохранить в csv как:
vlan location vlan_name
2 site1 vlan1
3 site2 vlan3
Но что бы я ни делал, не могу исправить это.
Ниже приведен код, но работает только первый набор данных, который я создал вручную.
Data set 1: Created manually
Data set 2: Original with only two entries provided
Data set 3: Original removing "u'"
Data set 4: Same as #1 but with "Decimal" added
#!/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
import json
import csv
vlan_data = '{"Items":[{"vlan": "11", "location": "site_1", "vlan_name": "vlan_name_11"},{"vlan": "12", "location": "site_1", "vlan_name": "vlan_name_12"}]}'
#vlan_data = "{u'Count': 2119, u'Items': [{u'vlan': Decimal('11'), u'location': u'site_1', u'vlan_name': u'vlan_name_11'}, {u'vlan': Decimal('12'), u'location': u'site_1', u'vlan_name': u'vlan_name_2'}], u'ScannedCount': 2119, 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': 'UOH8U2E4THOGDHJ5BKODNS4I83VV4KQNSO5AEMVJF66Q9ASUAAJG', 'HTTPHeaders': {'x-amzn-requestid': 'UOH8U2E4THOGDHJ5BKODNS4I83VV4KQNSO5AEMVJF66Q9ASUAAJG', 'content-length': '209370', 'server': 'Server', 'connection': 'keep-alive', 'x-amz-crc32': '2084548256', 'date': 'Thu, 13 Aug 2020 18:14:21 GMT', 'content-type': 'application/x-amz-json-1.0'}}}"
#vlan_data = "{Count': 2119, Items': [{vlan': Decimal('11'), location': site_1', vlan_name': vlan_name_11'}, {vlan': Decimal('12'), location': site_1', vlan_name': vlan_name_12'}], ScannedCount': 2119, 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': 'UOH8U2E4THOGDHJ5BKODNS4I83VV4KQNSO5AEMVJF66Q9ASUAAJG', 'HTTPHeaders': {'x-amzn-requestid': 'UOH8U2E4THOGDHJ5BKODNS4I83VV4KQNSO5AEMVJF66Q9ASUAAJG', 'content-length': '209370', 'server': 'Server', 'connection': 'keep-alive', 'x-amz-crc32': '2084548256', 'date': 'Thu, 13 Aug 2020 18:14:21 GMT', 'content-type': 'application/x-amz-json-1.0'}}}"
#vlan_data = '{"Items":[{"vlan": Decimal("11"), "location": "site_1", "vlan_name": "vlan_name_11"},{"vlan": Decimal("12"), "location": "site_1", "vlan_name": "vlan_name_12"}]}'
vlan_parsed = json.loads(vlan_data)
emp_data = vlan_parsed['Items']
# open a file for writing
v1_data = open('/Users/sergiogomez/Downloads/Vlan_Data.csv', 'w')
# create the csv writer object
csvwriter = csv.writer(v1_data)
count = 0
for v1 in emp_data:
if count == 0:
header = v1.keys()
csvwriter.writerow(header)
count = 1
csvwriter.writerow(v1.values())
v1_data.close()
Ошибка для 3 прокомментированных строк данных относится к строке:
vlan_parsed = json.loads(vlan_data)
Файл «/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/init.py», строка 348, в loads
return _default_decoder.decode(s)
Есть предложения / подсказки?
Комментарии:
1. Но в чем именно проблема? Возникает ли исключение? Или ваш результат не соответствует ожиданиям?
2. @qouify, извините, забыл добавить это, исходное сообщение было отредактировано. Но начинаю думать, что предоставленный файл не является допустимым форматом
3. Это тоже мое мнение. Я бы сказал, что
Decimal('11')
это недопустимый json.