2010-02-02 13 views
7

Tengo este enorme archivo JSON. Actualmente la forma en que estoy usando es:¿Cuál es la mejor manera de analizar el gran archivo JSON e insertarlo en la base de datos utilizando php?

  1. Leer todo el contenido en una cadena
  2. Haz json_decode, obtener la matriz
  3. recorrer la matriz de un registro a la vez y construir mi instrucción SQL de inserción

El problema es que el código es feo. Además, algunos de los objetos en estas matrices son en sí mismos matrices, y no todos los registros contienen todos los valores. Tengo que usar isset para verificar si hay un valor particular, o usar un valor predeterminado, etc. En general, funciona correctamente, pero el código es feo. ¿Hay alguna manera de que pueda escribir esto mejor?

+0

Para evitar la fealdad que debe decidir lo que es el puño de belleza. Quiero decir que debes saber qué campos tienes y qué valores quieres que llenen. Es la única forma, creo. – Kirzilla

+0

usando json_decode() es el camino correcto a seguir. Pero no puedo contarle más sobre su código si no lo publica aquí. – soulmerge

+0

Si MySQL no es una necesidad, también podría estar interesado en http://www.mongodb.org – VolkerK

Respuesta

0

La belleza está en el ojo del espectador.

Si el formato de JSON está fuera de su control, entonces no hay mucho que pueda hacer, excepto mezclar las piezas alrededor del tablero. Haga lo habitual de hacer que sus funciones sean lo más pequeñas y ordenadas posible en lugar de tener un bloque grande de código. La función múltiple será más fácil de leer y más reutilizable.

Tiendo a llamar a este proceso descomposición funcional.

Por supuesto, también puede adoptar un enfoque OO y construir algunos objetos agradables que se guarden en la base de datos y construirse a partir de piezas del objeto JSON, pero esto es básicamente lo mismo (excepto que hace que los puristas OO duerman mejor en noche).

2

Es difícil de aconsejar sin mirar el código, pero me gustaría recordarle sobre el operador PHP + para matrices, que combina dos matrices de forma no destructiva.

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

$fixed_data ahora se ve como array('Name' => 'John', 'Email' => '', 'Meta' => ''); sin necesidad de múltiples isset() comprueba. (Podría no ser aplicable a su caso, difícil de decir sin más información.)

+0

Olvidé la publicación del enlace, http://php.net/manual/en/language.operators.array.php –

+0

en el momento, el código se ve algo como: $ json = array ('nombre' => 'king Kong', 'dirección' => array otra aquí, .....) $ name = isset ($ json ['nombre'])? $ json ['name']: ''; .... repita el proceso anterior para la dirección. y finalmente escribe la instrucción de inserción. funciona, pero es feo – user61734

0

La mayoría de las bases de datos (MySQL, sqlite etc.) prefieren trabajar con el formato de datos XML en import/export data.

Puede convertir su objeto JSON en XML, y luego trabajar con eso.

No me sorprende ver las bases de datos que soportan JSON en el futuro cercano, pero por ahora esto es probablemente lo mejor que se puede hacer.

0

Si utiliza una bella abstracción de base de datos como ADODb, entonces no necesitará construir la consulta de inserción.

Este es el ejemplo de inserto usando ADODb:

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

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

Puesto que el resultado de json_encode ya un array, que encajan perfectamente. Si la definición de la columna en la base de datos permite null, la columna faltante en $data seguirá siendo una inserción válida.

Cuestiones relacionadas