Foros del Web » Programando para Internet » PHP »

Crear expresion regular para manipular un JSON

Estas en el tema de Crear expresion regular para manipular un JSON en el foro de PHP en Foros del Web. Estimado grupo, Necesito de su ayuda para procesar un texto JSON el caso es el siguiente: Tengo un texto que representa un JSON de la ...
  #1 (permalink)  
Antiguo 21/07/2011, 16:59
Avatar de Maxi.Net  
Fecha de Ingreso: abril-2005
Ubicación: R.M. Talagante, Chile!!
Mensajes: 295
Antigüedad: 19 años
Puntos: 2
Crear expresion regular para manipular un JSON

Estimado grupo,

Necesito de su ayuda para procesar un texto JSON el caso es el siguiente:

Tengo un texto que representa un JSON de la siguiente manera:
Código:
[
            {
                itemId: 'usu_id',
                xtype: 'hidden',
                name: 'su_id'
            },
            {
                itemId: 'usu_nombre',
                xtype: 'textfield',
                name: 'usu_nombre',
                fieldLabel: 'Nombre',
                allowBlank: false,
                maxLength : '50'
            }
]
La idea, es procesarlo con la expresión regular para dejarlo de la siguiente manera:

Código:
[
            {
                'itemId': 'usu_id',
                'xtype': 'hidden',
                'name': 'su_id'
            },
            {
                'itemId': 'usu_nombre',
                'xtype': 'textfield',
                'name': 'usu_nombre',
                'fieldLabel': 'Nombre',
                'allowBlank': false,
                'maxLength' : '50'
            }
]
En rigor, lo que necesito es que por ejemplo, cada vez que encuentre una palabra "x" seguida de ":" le aplique '' a la palabra de la siguiente manera:

Código:
itemId: 'usu_nombre'
//debe quedar como
'itemId': 'usu_nombre'
Saludos y muchas gracias amigos
__________________
Amtez de enpezar kom otro idioma,
escrivamos vien el nueztro i como corezpomde. Jracias.
  #2 (permalink)  
Antiguo 21/07/2011, 17:04
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Crear expresion regular para manipular un JSON

La expresión regular es sencilla, pero, ¿para que necesitas hacer el cambio?

Puesto a que JSON funciona perfectamente como está descrito, no necesitas cambiar nada para que sea funcional.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 21/07/2011, 17:20
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Crear expresion regular para manipular un JSON

Y ¿por qué no decodificarlo, alterar el array y luego volver a codificarlo?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 21/07/2011, 20:15
Avatar de Maxi.Net  
Fecha de Ingreso: abril-2005
Ubicación: R.M. Talagante, Chile!!
Mensajes: 295
Antigüedad: 19 años
Puntos: 2
Respuesta: Crear expresion regular para manipular un JSON

Gracias por responder. Les comento:

Cita:
Y ¿por qué no decodificarlo, alterar el array y luego volver a codificarlo?
Esa es la idea final, pero al usar el encoder del Zend Framework me devuelve un error de sintaxis y al usarlo con las " funciona sin problemas.


Saludos y gracias amigos!
P.D: Deben ser " no '
__________________
Amtez de enpezar kom otro idioma,
escrivamos vien el nueztro i como corezpomde. Jracias.
  #5 (permalink)  
Antiguo 21/07/2011, 20:45
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Crear expresion regular para manipular un JSON

¿Cómo haz hecho?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 21/07/2011, 20:49
Avatar de Maxi.Net  
Fecha de Ingreso: abril-2005
Ubicación: R.M. Talagante, Chile!!
Mensajes: 295
Antigüedad: 19 años
Puntos: 2
Respuesta: Crear expresion regular para manipular un JSON

Código:
 $json = "[
            {
                itemId: 'usu_id',
                xtype: 'hidden',
                name: 'su_id'
            },
            {
                itemId: 'usu_nombre',
                xtype: 'textfield',
                name: 'usu_nombre',
                fieldLabel: 'Nombre',
                allowBlank: false,
                maxLength : '50'
            }
]";
        
        $decode = Zend_Json::decode($json);
__________________
Amtez de enpezar kom otro idioma,
escrivamos vien el nueztro i como corezpomde. Jracias.
  #7 (permalink)  
Antiguo 21/07/2011, 21:43
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Crear expresion regular para manipular un JSON

Pero ¿como haces cuando arreglas el array y dices que te da error?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #8 (permalink)  
Antiguo 21/07/2011, 22:04
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Crear expresion regular para manipular un JSON

Si, yo necesito saber el mensaje de error que recibes, no las pruebas que haces.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 22/07/2011, 07:35
Avatar de Maxi.Net  
Fecha de Ingreso: abril-2005
Ubicación: R.M. Talagante, Chile!!
Mensajes: 295
Antigüedad: 19 años
Puntos: 2
Respuesta: Crear expresion regular para manipular un JSON

El error es un error de sintaxis:
Código PHP:
An error occurred

Application error

Exception information
:

MessageDecoding failedSyntax error

Stack trace
:

            
#0 /home/manuteko/public_html/demo_extjs_local/application/modules/default/controllers/IndexController.php(55): Zend_Json::decode('[?            {...')
#1 /home/manuteko/public_html/demo_extjs_local/library/Zend/Controller/Action.php(513): Default_IndexController->facturasAction()
#2 /home/manuteko/public_html/demo_extjs_local/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('facturasAction')
#3 /home/manuteko/public_html/demo_extjs_local/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#4 /home/manuteko/public_html/demo_extjs_local/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#5 /home/manuteko/public_html/demo_extjs_local/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#6 /home/manuteko/public_html/demo_extjs_local/public/index.php(26): Zend_Application->run()
#7 {main} 
Avanzando con la expresión regular he llegado a esto:

Código PHP:
 $patron '/[a-zA-Z]*\:/';   

 
preg_match_all($patron$json$coincidencias); 
Pero solo logro separar cada palabra y aún no doy con el como agregar los " " a la palabra para dejarla de la forma "itemId":

Saludos
__________________
Amtez de enpezar kom otro idioma,
escrivamos vien el nueztro i como corezpomde. Jracias.
  #10 (permalink)  
Antiguo 22/07/2011, 09:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Crear expresion regular para manipular un JSON

Segun la norma de JSON, los value/pairs deben de estar con comillas dobles, siempre, solo si son numeros, arrays, objetos o boleanos pueden ir sin comillas.

La cuestión sería ver porque estas generando ese JSON ya que esta "incorrecto".
  #11 (permalink)  
Antiguo 22/07/2011, 09:22
Avatar de Maxi.Net  
Fecha de Ingreso: abril-2005
Ubicación: R.M. Talagante, Chile!!
Mensajes: 295
Antigüedad: 19 años
Puntos: 2
Respuesta: Crear expresion regular para manipular un JSON

Estimado GatorV,

Ese JSON corresponde al formato usado por EXTJS en la definición de sus objetos. Por lo mismo, el formato no es el tema en discusión, digamos, que ese es el formato de entrada y no puedo modificarlo, solo debo adaptarlo.

Favor amigos, ayúdenme con la expresioń regular.
__________________
Amtez de enpezar kom otro idioma,
escrivamos vien el nueztro i como corezpomde. Jracias.
  #12 (permalink)  
Antiguo 22/07/2011, 09:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Crear expresion regular para manipular un JSON

Es que lo que quieres hacer es como forzarlo a que funcione. Lo que debes usar es primero decodificarlo, trabajarlo y luego codificarlo. Tratar de usar una expresión regular no es la mejor solución.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #13 (permalink)  
Antiguo 22/07/2011, 09:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Crear expresion regular para manipular un JSON

Te recomiendo usar esta pagina: http://jsonformatter.curiousconcept.com/ en ella puedes ver si tu JSON esta adecuado o no.

Es muy raro que ese formato te lo este generando ExtJS, ya que según se este genera JSON correcto con comillas dobles, ¿Como estas generandolo?
  #14 (permalink)  
Antiguo 22/07/2011, 09:43
Avatar de Maxi.Net  
Fecha de Ingreso: abril-2005
Ubicación: R.M. Talagante, Chile!!
Mensajes: 295
Antigüedad: 19 años
Puntos: 2
Respuesta: Crear expresion regular para manipular un JSON

Estimados,

Al usar ExtDesigner, se genera ese formato.
__________________
Amtez de enpezar kom otro idioma,
escrivamos vien el nueztro i como corezpomde. Jracias.
  #15 (permalink)  
Antiguo 22/07/2011, 09:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Crear expresion regular para manipular un JSON

Muy raro, si yo uso Ext.encode(obj); me genera un JSON valido con strings dobles como debería de estar.

Para que tu JSON sea valido no debe de tener comillas simples ', solamente dobles "".

Saludos.
  #16 (permalink)  
Antiguo 22/07/2011, 10:00
Avatar de Maxi.Net  
Fecha de Ingreso: abril-2005
Ubicación: R.M. Talagante, Chile!!
Mensajes: 295
Antigüedad: 19 años
Puntos: 2
Respuesta: Crear expresion regular para manipular un JSON

has probado con ExtDesigner?

Y continuando con lo que realmente necesito, que es la expresión regular y aplicarla al JSON, tengo lo siguiente:

Código PHP:
$patron '/([a-zA-Z^"\']+(?=:))/';
$sujeto $json;
$replacement '"${1}"';
echo 
preg_replace($patron$replacement$sujeto); 
Ya con eso tengo lo que necesito, pero aún existe el problema de los espacios entre la ultima letra de la palabra y el ":" ejemplo:

Código PHP:
...
maxLength '50'
...

/*Al aplicar la expresioń regular me queda:
"maxLength ": '50' // con el espacio
*/ 
Saludos
__________________
Amtez de enpezar kom otro idioma,
escrivamos vien el nueztro i como corezpomde. Jracias.
  #17 (permalink)  
Antiguo 22/07/2011, 10:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Crear expresion regular para manipular un JSON

No he probado el ExtDesigner, y si te genera JSON invalido deberías reportarlo directamente a sus creadores para que lo revisen.

Respecto a tu expresión regular, yo capturaria primero lo que esta antes de los : y luego lo que esta después, ya que también '50' es invalido, debería ser "50", entonces es mejor que parsees línea por linea e ir capturando los pares y reemplazando las comillas en caso de ser necesario.

Saludos.
  #18 (permalink)  
Antiguo 22/07/2011, 15:29
Avatar de Maxi.Net  
Fecha de Ingreso: abril-2005
Ubicación: R.M. Talagante, Chile!!
Mensajes: 295
Antigüedad: 19 años
Puntos: 2
Respuesta: Crear expresion regular para manipular un JSON

Bueno, después de haber perdido el tiempo discutiendo sobre el formato del JSON, dejo acá parte de la solución a la ayuda que solicité al foro, la expresión regular.

Código PHP:
$patron = array('/([a-zA-Z^"]+(?=\:))/'//Agregamos las " a los itemId, xtype, maxLenght, etc.
            
'/\'([a-zA-Z0-9_-]*?)\'/' //Reemplazamos las ' por " a los valores de los itemId, xtype, maxLength, etc
        
);
        
$replacement = array('"${1}"''"${1}"');
        
        
$data preg_replace($patron$replacement$json);

        
$jsonData Zend_Json::decode($data);
        
        echo 
'<pre>'
        
print_r($jsonData);
        exit(); 
Faltaría que el primer patrón de la expresión regular le quite los espacios en blanco entre la palabra y el :

Saludos y gracias!
__________________
Amtez de enpezar kom otro idioma,
escrivamos vien el nueztro i como corezpomde. Jracias.

Etiquetas: expresion, json, manipular, regular
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:40.