Ошибка при чтении строк файла JSON в приложении Django

#python #json #django

#python #json #django

Вопрос:

У меня есть этот код, но в моем файле JSON есть несколько строк с пустыми строками. И я получаю эту ошибку. Это пользовательская команда, и я получаю эту ошибку. Я хочу создать список заданий в базе данных моего приложения Django, я использую цикл For. Большое спасибо за вашу помощь

  raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 2)
  
 from django.core.management.base import BaseCommand
from jobs.models import Job
import json

class Command(BaseCommand):
    help = 'Set up the database'

    def handle(self, *args: str, **options: str):
        with open('static/joblist03112020.json', 'r') as handle:
            for line in handle.readlines():
                print(line)
                line = json.loads(line)

                existing_job = Job.objects.filter(

                    job_title = line['job_title'],
                    company = line['company'],
                    company_url = line['company_url'],
                    description = line['description'],
                    salary = line['salary'],
                    city = line['city'],
                    district = line['district'],
                    url = line['url'],
                    job_type = line['job_type'],

                )
                if existing_job.exists() is False:
                    Job.objects.create(

                        job_title = line['job_title'],
                        company = line['company'],
                        company_url = line['company_url'],
                        description = line['description'],
                        salary = line['salary'],
                        city = line['city'],
                        district = line['district'],
                        url = line['url'],
                        job_type = line['job_type'],

                    )

                    Job.save()
                    self.stdout.write(self.style.SUCCES('added jobs!add'))

  

Ответ №1:

Вероятно, вы захотите загрузить весь файл JSON вместо загрузки построчно. Не каждая строка в файле JSON гарантированно анализируется сама по себе как допустимый объект JSON.

Вот дух того, что, я думаю, вы хотите сделать:

 with open('static/joblist03112020.json') as f:
    job_list = json.load(f)
  

Обратите внимание, что по умолчанию используется открытие с 'r' помощью for read , поэтому я удалил его.

Теперь вы можете перебирать каждое задание в списке и применять фильтр. Если ключи вашего объекта JSON соответствуют столбцам вашей модели, вы также можете упростить этот код:

 for job in job_list:
    existing_job = Job.objects.filter(**job)
    if not existing_job.exists():
        Job.objects.create(**job)
  

Обратите внимание, что вам не нужно будет вызывать .save() , поскольку create включает сохранение. Кроме того, .save() метод в любом случае определяется только для экземпляра класса.

Комментарии:

1. `Команда класса (BaseCommand): help = ‘Настройка базы данных’ дескриптор def(self, * аргументы: str, ** параметры: str): с открытым (‘static/joblist03112020.json’) как f: job_list = json.load(f) для задания в job_list: existing_job= Job.objects.filter( ` вот так?

2. что означает соответствие моей модели? те же поля? и тот же порядок полей?

3. Если поля совпадают, вы можете использовать операцию распаковки словаря ( ** ) для передачи аргументов командам filter and create .

Ответ №2:

кто-то из этой платформы помогает мне с моей проблемой. это то, что я сделал. и решите проблему. Мне нужно было работать с большим JSON

  def handle(self, *args: str, **options: str):
            with open('static/data.json', 'r') as handle:
                big_json = json.loads(handle.read())
                for item in big_json:
                    existing_job = Job.objects.filter(