2012-06-19 13 views
5

Me gustaría representar un objeto Class como JSON. Por ejemplo, si tengo los DEFINCIONES clase de la siguiente manera:¿Cómo hacer una representación JSON de una clase Java?

public class MyClass { 
    String myName; 
    int myAge; 
    MyOtherClass other; 
} 

public class MyOtherClass { 
    double myDouble; 
} 

me gustaría obtener la siguiente JSON anidada de un objeto de la clase de tipo MiClase:

{ 
    myName: String, 
    myAge: int, 
    other: { 
     myDouble: double; 
    } 
} 

EDIT:

No quiero serializar instancias de estas clases, entiendo cómo hacerlo con GSON. Quiero serializar la estructura de la clase en sí, de modo que dado una clase propietaria Objeto, puedo generar JSON que desglosa los campos de la clase recursivamente en objetos estándar como Cadena, Doble, etc.

Respuesta

1

Recomendaría utilizar Jackson. También puede echar un vistazo a la clase JSonObjectSerializer basada en Jackson que se puede encontrar en oVirt en engine/backend/manager/module/utils (puede clonar el código) y ver cómo usamos Jackson allí.

+0

El problema con todos estos es que no puedo obtener el tipo de campo, que para mí es la parte más importante. –

+1

@hatboysam - Jackson permite serializar/deserializar también los tipos de campo. Vea el trabajo que hicimos en www.ovirt.org (obtenga el código, consulte engine/backend/manager/modules/utils - verá algún código que escribimos para la serialización y deserialización de JSon). –

3

Con Jettison, puede lanza tus propias asignaciones de Java a JSON. Entonces, en este caso, podría obtener el objeto Class de la clase que desea, luego mapear el Java devuelto por los métodos getFields, getConstructors, getMethods etc. a JSON usando Jettison.

0

Buscando hacer lo mismo, al final terminé escribiendo mi propio método, esto no se aplica a todos los casos, p. si uno de los campos declarados es un mapa de este se romperá, pero esto parece estar bien para los objetos más comunes:

@Override 
public Map reflectModelAsMap(Class classType) { 
    List<Class> mappedTracker = new LinkedList<Class>(); 

    return reflectModelAsMap(classType, mappedTracker); 
} 

private Map reflectModelAsMap(Class classType, List mappedTracker) { 
    Map<String, Object> mapModel = new LinkedHashMap<String, Object>(); 

    mappedTracker.add(classType); 

    Field[] fields = classType.getDeclaredFields(); 

    for (Field field : fields) { 
     if (mappedTracker.contains(field.getType())) 
      continue; 

     if (BeanUtils.isSimpleValueType(field.getType())) { 
      mapModel.put(field.getName(), field.getType().toString()); 
     } else if (Collection.class.isAssignableFrom(field.getType())) { 
      Class actualType = (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; 
      mapModel.put("Collection", reflectModelAsMap(actualType, mappedTracker)); 
     } else { 
      mapModel.put(field.getName(), reflectModelAsMap(field.getType(), mappedTracker)); 
     } 
    } 

    return mapModel; 
} 

El rastreador asignado allí debido a cómo manejar las relaciones en hibernación; sin ella, existe una relación interminable recursiva entre padres e hijos, por ejemplo. child.getFather().getFirstChild().getFather().getFirstChild().getFather()...

Cuestiones relacionadas