2012-06-19 17 views
5

Id mi piace rappresentare un oggetto di classe come JSON. Per esempio, se ho le defintions classe come segue:Come creare una rappresentazione JSON di una classe Java?

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

public class MyOtherClass { 
    double myDouble; 
} 

mi piacerebbe ottenere le seguenti nidificato JSON da un oggetto di classe di tipo MyClass:

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

EDIT:

Non voglio serializzare le istanze di queste classi, capisco come farlo con GSON. Voglio serializzare la struttura della classe stessa, in modo che data una classe proprietaria oggetto I può generare JSON che suddivide i campi della classe ricorsivamente in oggetti standard come String, Double, ecc.

risposta

1

Consiglierei l'utilizzo di Jackson. Puoi anche dare un'occhiata alla classe JSonObjectSerializer basata su Jackson che può essere trovata su oVirt sotto engine/backend/manager/module/utils (puoi clonare il codice) e vedere come abbiamo usato Jackson lì.

+0

Il problema con tutti questi è che non riesco a ottenere il tipo di campo, che per me è la parte più importante. –

+1

@hatboysam - Jackson, serializziamo/deserializziamo anche i tipi di campo. Guarda il lavoro che abbiamo fatto su www.ovirt.org (prendi il codice, guarda il motore/backend/manager/modules/utils - vedrai il codice che abbiamo scritto per serializzare e deserializzare JSon). –

3

Con Jettison, è possibile tira le tue mappature da Java a JSON. Quindi, in questo caso, è possibile ottenere l'oggetto Classe della classe desiderata, quindi mappare il Java restituito dai metodi getFields, getConstructors, getMethods ecc. A JSON utilizzando Jettison.

0

Cercando di fare la stessa cosa, alla fine ho finito per scrivere il mio metodo, questo non gestisce tutti i casi, ad es. se uno dei campi dichiarati è una mappa di questo si romperà, ma questo sembra essere a posto per gli oggetti più comuni:

@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; 
} 

Il tracker mappato lì perché di come gestire i rapporti in Hibernate; senza di essa esiste una relazione infinitamente ricorsiva tra genitore e figlio, ad es. child.getFather().getFirstChild().getFather().getFirstChild().getFather()...

Problemi correlati