Solucionado, dejo adjunto.
El 3 de junio de 2014, 19:56, Jhonatan Sneider Salguero Villa < sney2...@gmail.com> escribió: > Hola, > > por lo que veo el json esta mal formado (o le falta una parte a la > cadena), para poder parsearlo hay que eliminar la parte sobrante: > > import json > > # remover la parte sobrante > json_string = json_string = string.replace(',"version":"1.0" ', '}') > > data = json.loads(json_string) > > # si la cadena tiene la misma estructura siempre puedes hacer esto > channels = data["result"]["devices"][0]["channels"] > > key_value = map(lambda a: a.items(), channels) > > con esto tienes una lista de listas con el formato > > [('value', valor_value), ('meta', valor_meta), ('name', valor_name), > ('unit', valor_unit)] > > > El 3 de junio de 2014, 15:55, Miguel Angel Rodriguez <maro...@gmail.com> > escribió: > > Este es un ejemplo de lo que recibo: >> >> {"format":"JSON","result":{"devices":[{"key":"SCGDE1BA:180340320","channels":[{"name":"PF","unit":"","meta":"PF","value":"1.000"},{"name":"P-WSpt","unit":"kW","meta":"P-WSpt","value":"935"}, >> >> {"name":"Vac","unit":"V","meta":"Vac","value":"217.5"},{"name":"Iac","unit":"A","meta":"Iac","value":"513.8"},{"name":"Pac","unit":"kW","meta":"Pac","value":"335.2"},{"name":"Qac","unit":"kV >> >> Ar","meta":"Qac","value":"-1.0"},{"name":"Sac","unit":"kVA","meta":"Sac","value":"335.1"},{"name":"Fac","unit":"Hz","meta":"Fac","value":"49.950"},{"name":"ErrNoFirst","unit":"","meta":"ErrNoFirst","value":"0"},{" >> >> name":"P-WModFailStt","unit":"","meta":"P-WModFailStt","value":"Off"},{"name":"P-WModStt","unit":"","meta":"P-WModStt","value":"Off"},{"name":"Dsc","unit":"","meta":"Dsc","value":"---"},{"name":"Firmware-9","unit":"","meta":"Firmware-9","value":" >> "},{"name":"Cntry","unit":"","meta":"Cntry","value":"DE1"} >> ,{"name":"Type","unit":"","meta":"Type","value":"SCG"},{"name":"Mode","unit":"","meta":"Mode","value":"Operation"},{"name":"Error","unit":"","meta":"Error","value":"---"}]}]},"version":"1.0" >> >> >> >> Quiero parsearlo para poder almacenar en unas variables que tengo los >> values que aparecen en el JSON. De esta forma: >> >> Con la solucion con expresiones regulares en cada iteracion tengo lo >> siguiente: >> d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del >> meta),value,(valor del value)] >> >> En esa iteracion hago lo siguiente: >> if d_value[1] == "PF": >> mi_variable_PF = d_value[7] >> if d_value[1] == "Fac": >> mi_variable_Fac = d_value[7] >> ..... >> >> No necesito todos los values, solo los que corresponden a unos >> determinados name. >> >> Con la solucion con expresiones regulares tengo el siguiente bug: >> Alguna veces en el json aparece "unit":"". Es decir, la clave key no >> tiene valor, por lo que obtengo un array de solo 7 elementos (sin el >> elemento valor del unit) y consigo recuperar el value para ese name. >> ¿Alguien me podría ayudar con esto? >> >> Por ultimo, con la solucion con JSON, ¿es necesario usar ficheros? No se >> como será el manejo de ficheros en el sistema donde va a funcionar este >> python. >> >> >> Gracias y un saludo >> >> >> El 3 de junio de 2014, 22:53, Miguel Angel Rodriguez <maro...@gmail.com> >> escribió: >> >> Este es un ejemplo de lo que recibo: >>> >>> {"format":"JSON","result":{"devices":[{"key":"SCGDE1BA: >>> 180340320","channels":[{"name":"PF","unit":"","meta":"PF"," >>> value":"1.000"},{"name":"P-WSpt","unit":"kW","meta":"P-WSpt","value":"935"}, >>> {"name":"Vac","unit":"V","meta":"Vac","value":"217.5"},{ >>> "name":"Iac","unit":"A","meta":"Iac","value":"513.8"},{" >>> name":"Pac","unit":"kW","meta":"Pac","value":"335.2"},{"name":"Qac","unit":"kV >>> Ar","meta":"Qac","value":"-1.0"},{"name":"Sac","unit":"kVA" >>> ,"meta":"Sac","value":"335.1"},{"name":"Fac","unit":"Hz"," >>> meta":"Fac","value":"49.950"},{"name":"ErrNoFirst","unit":"" >>> ,"meta":"ErrNoFirst","value":"0"},{" >>> name":"P-WModFailStt","unit":"","meta":"P-WModFailStt"," >>> value":"Off"},{"name":"P-WModStt","unit":"","meta":"P- >>> WModStt","value":"Off"},{"name":"Dsc","unit":"","meta":" >>> Dsc","value":"---"},{"name":"Firmware-9","unit":"","meta":"Firmware-9","value":" >>> "},{"name":"Cntry","unit":"","meta":"Cntry","value":"DE1"} >>> ,{"name":"Type","unit":"","meta":"Type","value":"SCG"},{" >>> name":"Mode","unit":"","meta":"Mode","value":"Operation"},{" >>> name":"Error","unit":"","meta":"Error","value":"---"}]}]},"version":"1.0" >>> >>> >>> >>> Quiero parsearlo para poder almacenar en unas variables que tengo los >>> values que aparecen en el JSON. De esta forma: >>> >>> Con la solucion con expresiones regulares en cada iteracion tengo lo >>> siguiente: >>> d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del >>> meta),value,(valor del value)] >>> >>> En esa iteracion hago lo siguiente: >>> if d_value[1] == "PF": >>> mi_variable_PF = d_value[7] >>> if d_value[1] == "Fac": >>> mi_variable_Fac = d_value[7] >>> ..... >>> >>> No necesito todos los values, solo los que corresponden a unos >>> determinados name. >>> >>> Con la solucion con expresiones regulares tengo el siguiente bug: >>> Alguna veces en el json aparece "unit":"". Es decir, la clave key no >>> tiene valor, por lo que no consigo >>> >>> >>> El 3 de junio de 2014, 22:40, Flavio Danesse <fdane...@gmail.com> >>> escribió: >>> >>> Si quieres pasame un string de ejemplo que esté completo y dime que >>>> hacer con los values y te escribo la solución. >>>> >>>> >>>> El 3 de junio de 2014, 17:38, Flavio Danesse <fdane...@gmail.com> >>>> escribió: >>>> >>>> Lo que hago es tomar el string que tienes y guardarlo en un archivo >>>>> como texto plano pero luego lo cargo utilizando json con lo cual obtengo >>>>> un >>>>> diccionario python. Para obtener las keys y values del diccionario solo >>>>> tienes que hacer diccionario.keys() y diccionario.values() o puedes hacer >>>>> también diccionario.items() lo cual te da la pareja key:value. >>>>> >>>>> En todos los casos obtendrás lista de keys, values o items. >>>>> >>>>> Ahora bien, el primer obstáculo está salvado, que era pasar el string >>>>> a un diccionario donde tienes parejas key-value. >>>>> >>>>> El segundo obstaculo es hacer recursividad dentro del diccionario para >>>>> seguir hacia adentro de la estructura obteniendo los diccionarios >>>>> internos. >>>>> No es tan complicado, puedes comenzar con algo como: >>>>> >>>>> for key in diccionario.keys(): >>>>> valor = diccionario[key] >>>>> . . . lo que quieras con el key y lo que quieras con value aca >>>>> importa que tipo de dato es el value, porque por lo que veo tienes listas, >>>>> diccionarios, string, etc, utiliza type(valor) para operar sobre ellos >>>>> según su tipo. >>>>> >>>>> >>>>> >>>>> >>>>> El 3 de junio de 2014, 17:13, Miguel Angel Rodriguez < >>>>> maro...@gmail.com> escribió: >>>>> >>>>> No entiendo que haces con archivo... >>>>>> >>>>>> Nunca he programado con json en python. >>>>>> >>>>>> ¿Como seria a partir de lo que indicas el parseo de los datos? Es >>>>>> decir, ¿Como seria el bucle que me iria dando el name y el value? >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> 2014-06-03 22:08 GMT+02:00 Flavio Danesse <fdane...@gmail.com>: >>>>>> >>>>>> Voto por lo correcto que sería así: >>>>>>> >>>>>>> import os >>>>>>> import json >>>>>>> import codecs >>>>>>> >>>>>>> text = >>>>>>> '{"format":"JSON","result":{"devices":[{"key":"SCGDE1BA:180340320", etc >>>>>>> . . . >>>>>>> >>>>>>> path = "/tmp/x.json" >>>>>>> >>>>>>> archivo = open(path, "w") >>>>>>> archivo.write(text) >>>>>>> archivo.close() >>>>>>> >>>>>>> archivo = codecs.open(path, "r", "utf-8") >>>>>>> diccionario = json.JSONDecoder("utf-8").decode(archivo.read()) >>>>>>> >>>>>>> >>>>>>> El 3 de junio de 2014, 8:03, <gust...@nodo50.org> escribió: >>>>>>> >>>>>>> ejecutando esto: >>>>>>>> >>>>>>>> #!/usr/bin/python3 >>>>>>>> import re >>>>>>>> value_str = >>>>>>>> >>>>>>>> '{"format":"JSON","result":{"devices":[{"key":"SCGDE1BA:180340320","channels":[{"name":"PF","unit":"","meta":"PF","value":"1.000"},{"name":"P-WSpt","unit":"kW","meta":"P-WSpt","value":"935"},{"name":"Vac","unit":"V","meta":"Vac","value":"217.5"},{"name":"Iac","unit":"A","meta":"Iac","value":"513.8"},{"name":"Pac","unit":"kW","meta":"Pac","value":"335.2"},{"name":"Qac","unit":"kVAr","meta":"Qac","value":"-1.0"},{"name":"Sac","unit":"kVA","meta":"Sac","value":"335.1"},{"name":"Fac","unit":"Hz","meta":"Fac","value":"49.950"},{"name":"ErrNoFirst","unit":"","meta":"ErrNoFirst","value":"0"},{"name":"P-WModFailStt","unit":"","meta":"P-WModFailStt","value":"Off"},{"name":"P-WModStt","unit":"","meta":"P-WModStt","value":"Off"},{"name":"Dsc","unit":"","meta":"Dsc","value":"---"},{"name":"Firmware-9","unit":"","meta":"Firmware-9","value":""},{"name":"Cntry","unit":"","meta":"Cntry","value":"DE1"} >>>>>>>> >>>>>>>> ,{"name":"Type","unit":"","meta":"Type","value":"SCG"},{"name":"Mode","unit":"","meta":"Mode","value":"Operation"},{"name":"Error","unit":"","meta":"Error","value":"---"}]}]},"version":"1.0"' >>>>>>>> >>>>>>>> for channel_str in >>>>>>>> re.findall("\"name\":\"[A-Za-z0-9\-.]+\"",value_str): >>>>>>>> for channel_str1 in >>>>>>>> re.findall("\"value\":\"[A-Za-z0-9\-.]+\"",value_str): >>>>>>>> print ( channel_str + ";" + channel_str1 ) >>>>>>>> >>>>>>>> me da esto: >>>>>>>> >>>>>>>> "name":"Cntry";"value":"335.2" >>>>>>>> "name":"Cntry";"value":"-1.0" >>>>>>>> "name":"Cntry";"value":"335.1" >>>>>>>> "name":"Cntry";"value":"49.950" >>>>>>>> "name":"Cntry";"value":"0" >>>>>>>> "name":"Cntry";"value":"Off" >>>>>>>> "name":"Cntry";"value":"Off" >>>>>>>> "name":"Cntry";"value":"---" >>>>>>>> "name":"Cntry";"value":"DE1" >>>>>>>> "name":"Cntry";"value":"SCG" >>>>>>>> "name":"Cntry";"value":"Operation" >>>>>>>> "name":"Cntry";"value":"---" >>>>>>>> "name":"Type";"value":"1.000" >>>>>>>> "name":"Type";"value":"935" >>>>>>>> "name":"Type";"value":"217.5" >>>>>>>> "name":"Type";"value":"513.8" >>>>>>>> "name":"Type";"value":"335.2" >>>>>>>> "name":"Type";"value":"-1.0" >>>>>>>> "name":"Type";"value":"335.1" >>>>>>>> "name":"Type";"value":"49.950" >>>>>>>> >>>>>>>> >>>>>>>> te vale? >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> > Hola a todos, >>>>>>>> > >>>>>>>> > Estoy intentando parsear con Python una gran cadena que recibo en >>>>>>>> un >>>>>>>> > software de comunicaciones que estoy programando. >>>>>>>> > >>>>>>>> > La cadena que yo recibo es la siguiente: >>>>>>>> > >>>>>>>> > value_str = >>>>>>>> > >>>>>>>> {"format":"JSON","result":{"devices":[{"key":"SCGDE1BA:180340320","channels":[{"name":"PF","unit":"","meta":"PF","value":"1.000"},{"name":"P-WSpt","unit":"kW","meta":"P-WSpt","value":"935"}, >>>>>>>> > >>>>>>>> > >>>>>>>> {"name":"Vac","unit":"V","meta":"Vac","value":"217.5"},{"name":"Iac","unit":"A","meta":"Iac","value":"513.8"},{"name":"Pac","unit":"kW","meta":"Pac","value":"335.2"},{"name":"Qac","unit":"kV >>>>>>>> > >>>>>>>> > >>>>>>>> Ar","meta":"Qac","value":"-1.0"},{"name":"Sac","unit":"kVA","meta":"Sac","value":"335.1"},{"name":"Fac","unit":"Hz","meta":"Fac","value":"49.950"},{"name":"ErrNoFirst","unit":"","meta":"ErrNoFirst","value":"0"},{" >>>>>>>> > >>>>>>>> > >>>>>>>> name":"P-WModFailStt","unit":"","meta":"P-WModFailStt","value":"Off"},{"name":"P-WModStt","unit":"","meta":"P-WModStt","value":"Off"},{"name":"Dsc","unit":"","meta":"Dsc","value":"---"},{"name":"Firmware-9","unit":"","meta":"Firmware-9","value":" >>>>>>>> > "},{"name":"Cntry","unit":"","meta":"Cntry","value":"DE1"} >>>>>>>> > >>>>>>>> ,{"name":"Type","unit":"","meta":"Type","value":"SCG"},{"name":"Mode","unit":"","meta":"Mode","value":"Operation"},{"name":"Error","unit":"","meta":"Error","value":"---"}]}]},"version":"1.0" >>>>>>>> > >>>>>>>> > >>>>>>>> > Yo solo quiero quedarme con los name y value existente. >>>>>>>> > >>>>>>>> > LA forma en la que lo estoy intentando es la siguiente: >>>>>>>> > >>>>>>>> > for channel_str in re.findall("\"name\":\"[A-Za-z0-9\-. >>>>>>>> > ]+\",\"value\":\"[A-Za-z0-9\-. ]*\"",value_str): >>>>>>>> > d_value = re.findall("[A-Za-z0-9.\-]+",channel_str) >>>>>>>> > >>>>>>>> > Pero de esta forma no entra en el for. >>>>>>>> > >>>>>>>> > ¿Alguien me puede ayudar? >>>>>>>> > >>>>>>>> > Gracias y un saludo >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > -- >>>>>>>> > Miguel Ángel Rodríguez de Alba >>>>>>>> > 678304435 >>>>>>>> > maro...@gmail.com >>>>>>>> > _______________________________________________ >>>>>>>> > Python-es mailing list >>>>>>>> > Python-es@python.org >>>>>>>> > https://mail.python.org/mailman/listinfo/python-es >>>>>>>> > FAQ: http://python-es-faq.wikidot.com/ >>>>>>>> > >>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> Python-es mailing list >>>>>>>> Python-es@python.org >>>>>>>> https://mail.python.org/mailman/listinfo/python-es >>>>>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>>>>> >>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> Python-es mailing list >>>>>>> Python-es@python.org >>>>>>> https://mail.python.org/mailman/listinfo/python-es >>>>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Miguel Ángel Rodríguez de Alba >>>>>> 678304435 >>>>>> maro...@gmail.com >>>>>> >>>>>> _______________________________________________ >>>>>> Python-es mailing list >>>>>> Python-es@python.org >>>>>> https://mail.python.org/mailman/listinfo/python-es >>>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>>> >>>>>> >>>>> >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es@python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>>> >>> >>> >>> -- >>> Miguel Ángel Rodríguez de Alba >>> 678304435 >>> maro...@gmail.com >>> >> >> >> >> -- >> Miguel Ángel Rodríguez de Alba >> 678304435 >> maro...@gmail.com >> >> _______________________________________________ >> Python-es mailing list >> Python-es@python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > _______________________________________________ > Python-es mailing list > Python-es@python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > >
#!/usr/bin/env python # -*- coding: utf-8 -*- # Contenido del json (un json siempre es un diccionario): json_source = {"format":"JSON","result":{"devices":[{"key":"SCGDE1BA:180340320","channels":[{"name":"PF","unit":"","meta":"PF","value":"1.000"},{"name":"P-WSpt","unit":"kW","meta":"P-WSpt","value":"935"},{"name":"Vac","unit":"V","meta":"Vac","value":"217.5"},{"name":"Iac","unit":"A","meta":"Iac","value":"513.8"},{"name":"Pac","unit":"kW","meta":"Pac","value":"335.2"},{"name":"Qac","unit":"kVAr","meta":"Qac","value":"-1.0"},{"name":"Sac","unit":"kVA","meta":"Sac","value":"335.1"},{"name":"Fac","unit":"Hz","meta":"Fac","value":"49.950"},{"name":"ErrNoFirst","unit":"","meta":"ErrNoFirst","value":"0"},{"name":"P-WModFailStt","unit":"","meta":"P-WModFailStt","value":"Off"},{"name":"P-WModStt","unit":"","meta":"P-WModStt","value":"Off"},{"name":"Dsc","unit":"","meta":"Dsc","value":"---"},{"name":"Firmware-9","unit":"","meta":"Firmware-9","value":""},{"name":"Cntry","unit":"","meta":"Cntry","value":"DE1"},{"name":"Type","unit":"","meta":"Type","value":"SCG"},{"name":"Mode","unit":"","meta":"Mode","value":"Operation"},{"name":"Error","unit":"","meta":"Error","value":"---"}]}]},"version":"1.0"} # Estructura del json en este caso particular: #{ # version: str, # format: str, # result: {[{} ,{} ,{} ,{} ,{}]}, #} # Esto guarda el json con formato para facil lectura: #import json #archivo = open("/tmp/json_source.json", "w") #archivo.write(json.dumps(json_source, indent=4)) #archivo.close() # Esto carga un diccionario python a partir de un archivo json: #import json #import codecs #archivo = codecs.open("/tmp/json_source.json", "r", "utf-8") #diccionario = json.JSONDecoder("utf-8").decode(archivo.read()) def print_keys(diccionario): """ Función Recursiva que opera sobre un diccionario. """ # para todas las claves en diccionario for k in diccionario.keys(): value_type = type(diccionario[k]) # si el valor en esta key es una lista: if 'list' in str(value_type): # como en este caso particular esta clave posee una lista de diccionarios, # se hace recursividad en esta función, con ese diccionario interno. for item in diccionario[k]: print_keys(item) # Recursividad sobre esta función else: # si el valor en esta key no es una lista, es porque se ha pasado # un diccionario interno de ella, el cual solo contiene strings como, # valores de cada key. (Esto funciona solo con este json en particular) if k == "name": print k, "=", diccionario[k] # key es la clave # json_source[key] es el valor que ella contiene for key in json_source.keys(): value_type = type(json_source[key]) if 'dict' in str(value_type): print_keys(json_source[key]) else: print key, "=", json_source[key]
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/