Каков наилучший способ для анализа большого файла JSON и вставки в базу данных с помощью php? - PullRequest
7 голосов
/ 02 февраля 2010

У меня есть этот огромный JSON-файл. В настоящее время я использую его так:

  1. Прочитать все содержимое в строку
  2. сделать json_decode, получить массив
  3. Зацикливаться в массиве по одной записи за раз и создавать оператор SQL для вставки

Проблема в том, что код ужасен. Кроме того, некоторые объекты в этих массивах сами являются массивами, и не все записи содержат все значения. Я должен использовать isset, чтобы проверить наличие определенного значения, или использовать значение по умолчанию и т. Д. В целом, это работает правильно, но код уродлив. Можно ли как-нибудь написать это лучше?

Ответы [ 5 ]

2 голосов
/ 02 февраля 2010

Трудно дать совет, не глядя на код, но я хотел бы напомнить вам об операторе PHP + для массивов, который неразрушающим образом объединяет два массива.

$default_values = array('Name' => '', 'Email' => '', 'Meta' => '');
$data = array('Name' => 'John'); // Only name set
$fixed_data = $data + $default_values;

$fixed_data теперь выглядит как array('Name' => 'John', 'Email' => '', 'Meta' => ''); без необходимости множественных проверок isset (). (Может быть неприменимо к вашему делу, трудно сказать без дополнительной информации.)

1 голос
/ 02 февраля 2010

Если вы не хотите писать некрасивый код для генерации SQL-запросов, подумайте об использовании ORM Пропел и учение - это те, которые я лично использовал.

В доктрине есть метод для генерации объекта из массива и последующего вызова метода сохранения.

посмотрите на это http://www.doctrine -project.org / документация / ручной / 1_0 / о / рабочая-с моделями: массивы-и-объекты: от-массива

0 голосов
/ 02 февраля 2010

Если вы используете красивую абстракцию базы данных, такую ​​как ADODb , вам больше не нужно будет строить запрос на вставку.

Это пример вставки с использованием ADODb :

$data['col1'] = 'value1';
$data['col2'] = 'value2';
$data['col3'] = 'value3';

$result = $adodb->AutoExecute($tablename, $data, 'INSERT');

Так как результат json_encode уже array, он идеально подходит. Если определение столбца в базе данных разрешает null, то отсутствующий столбец в $data все равно будет допустимой вставкой.

0 голосов
/ 02 февраля 2010

Большинство баз данных (MySQL, sqlite и т. Д.) Предпочитают работать с форматом данных XML на импорт / экспорт данных .

Вы можете преобразовать свой объект JSON в XML, а затем работатьс этим.

Я не удивлен, увидев базы данных, поддерживающие JSON в ближайшем будущем, но на данный момент это, вероятно, лучшее, что можно сделать.

0 голосов
/ 02 февраля 2010

Красота в глазах смотрящего.

Если формат JSON находится вне вашего контроля, вы ничего не можете сделать, кроме как перемешать фигуры вокруг доски.Сделайте обычное дело, сделав ваши функции как можно меньше и аккуратнее, вместо того, чтобы иметь один большой блок кода.Множественные функции будут проще для чтения и более пригодны для повторного использования.

Я склонен называть этот процесс функциональной декомпозицией .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...