2012-06-04 9 views
8

en Python 2.7+ Puedo usar el object_pairs_hook en el módulo json incorporado para cambiar el tipo de los objetos descodificados. ¿Hay alguna forma de hacer lo mismo para las listas?Python: Cambiar el tipo de lista para la decodificación json

Una opción es ir a través de los objetos que obtengo como argumentos para el gancho y reemplazarlos por mi propio tipo de lista, pero ¿hay alguna otra manera más inteligente?

Respuesta

6

Para hacer algo similar con las listas tendrá que subclasificar el JSONDecoder. A continuación se muestra un ejemplo simple que funciona como object_pairs_hook. Esto usa la implementación pura de python de la exploración de cadenas en lugar de la implementación de C.

import json 

class decoder(json.JSONDecoder): 

    def __init__(self, list_type=list, **kwargs): 
     json.JSONDecoder.__init__(self, **kwargs) 
     # Use the custom JSONArray 
     self.parse_array = self.JSONArray 
     # Use the python implemenation of the scanner 
     self.scan_once = json.scanner.py_make_scanner(self) 
     self.list_type=list_type 

    def JSONArray(self, s_and_end, scan_once, **kwargs): 
     values, end = json.decoder.JSONArray(s_and_end, scan_once, **kwargs) 
     return self.list_type(values), end 

s = "[1, 2, 3, 4, 3, 2]" 
print json.loads(s, cls=decoder) # [1, 2, 3, 4, 3, 2] 
print json.loads(s, cls=decoder, list_type=list) # [1, 2, 3, 4, 3, 2] 
print json.loads(s, cls=decoder, list_type=set) # set([1, 2, 3, 4]) 
print json.loads(s, cls=decoder, list_type=tuple) # set([1, 2, 3, 4, 3, 2]) 
1

De acuerdo con el código fuente no es posible: la función de nivel C instancia explícitamente el tipo incorporado list sin utilizar ninguna devolución de llamada/ganchos. Lo mismo en el maletero.

Cuestiones relacionadas