Распечатайте или сохраните tp csv файл json с символами Юникода и дополнительными полями

#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.