JSONDecodeError при разборе фанки JSON - PullRequest
0 голосов
/ 21 января 2020

Недавно я начал работать с JSON (с Python 3.7 в Debian 9). Это первый (вероятно, из многих) набор данных в JSON, с которым я имел удовольствие работать.

Я использовал встроенный модуль Python 1034 * для интерпретации произвольных строк и файлы. Теперь у меня есть база данных с ~ 5570 строками, относящимися к заданному списку серверов. В конвейере есть много вещей, для которых я разработал план, но я застрял на этой конкретной системе санитарии.

Вот код, который я использую для анализа:

#!/usr/local/bin/python3.7
import json


def servers_from_json(file_name):
    with open(file_name, 'r') as f:
        data = json.loads(f.read())
        servers = [{'asn': item['data']['resource'], 'resource': item['data']['allocations'][0]['asn_name']} for item in data]
        return servers

servers = servers_from_json('working-things/working-format-for-parse')
print(servers) 

Мой мотив

Я пытаюсь сопоставить каждый из этих серверов с их именем ASN_NAME (это поле извлечено прямо из API RIPE; таким образом, предоставляя мне информацию, относящуюся к физический d c, на котором расположен каждый сервер. Затем, как только это будет сделано, я запишу их в существующую таблицу SQL, рядом с логическим значением.

Итак, вот где он становится фанк. Я запускаю весь набор данных через это, я получаю это сообщение об ошибке :

Traceback (most recent call last):
  File "./parse-test.py", line 12, in <module>
    servers = servers_from_json('2servers.json')
  File "./parse-test.py", line 7, in servers_from_json
    data = json.loads(f.read())
  File "/usr/local/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.7/json/decoder.py", line 340, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 38 column 2 (char 1098)

Я заметил, что проблема с моим начальным набором данных заключалась в том, что каждый объект JSON не был ограничен , \ n. Произошла некоторая очистка, все еще не повезло.

Затем я добавил первые 3 (?) объекта в полностью чистый файл и ... успешно. Я могу заставить скрипт читать и интерпретировать их так, как это нужно. Я хочу.

Вот набор данных с разделитель запятой:

http://db.farnworth.site/servers.json

Вот рабочий набор данных:

http://db.farnworth.site/working-format.json

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 21 января 2020

Я предполагаю, что | не будет присутствовать как часть данных. И разделите каждый из информационных блоков, используя |, затем преобразуйте его в список и загрузите каждый элемент списка, используя модуль json. Надеюсь, это поможет!

Вы можете попробовать:

import json
import re

with open("servers.json", 'r') as f:
    data = f.read()
    pattern = re.compile(r'\}\{')
    data = pattern.sub('}|{', data).split('|')
    for item in data:
        server_info = json.loads(item)
        allocations = server_info['data']['allocations']
        for alloc in allocations:
            print(alloc['asn_name'])


Я мог бы прочитать output.json вот так

import json
import re

with open("output.json", 'r') as f:
    data = f.read()
    server_info = json.loads(data)  
    for item in server_info:
        allocations = item['data']['allocations']
        for alloc in allocations:
            print(alloc['asn_name'])
...