2012-06-19 5 views
5

Id möchte ein Klassenobjekt als JSON darstellen. wenn ich die Klasse defintions habe zum Beispiel wie folgt:Wie mache ich eine JSON-Repräsentation einer Java-Klasse?

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

public class MyOtherClass { 
    double myDouble; 
} 

Ich mag die folgende verschachtelte JSON aus einem Klasse-Objekt vom Typ MyClass erhalten:

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

EDIT:

Ich möchte Instanzen dieser Klassen nicht serialisieren, ich verstehe, wie man das mit GSON macht. Ich möchte die Struktur der Klasse selbst serialisieren, so dass ich bei einem proprietären Klassenobjekt JSON erzeugen kann, das die Felder der Klasse rekursiv in Standardobjekte wie String, Double, etc. zerlegt.

Antwort

1

Ich würde empfehlen, Jackson zu verwenden. Sie können auch die JSonObjectSerializer-Klasse auf der Basis von Jackson ansehen, die unter oVirt unter engine/backend/manager/modul/utils zu finden ist (Sie können den Code klonen) und sehen, wie wir Jackson dort verwendet haben.

+0

Das Problem mit all diesen ist, dass ich den Feldtyp nicht bekommen kann, was für mich der wichtigste Teil ist. –

+1

@hatboysam - Jackson lassen Sie auch Feldtypen serialisieren/deserialisieren. Sehen Sie sich die Arbeit an, die wir auf www.ovirt.org gemacht haben (holen Sie sich den Code, sehen Sie sich Engine/Backend/Manager/Module/Utils an - Sie werden Code sehen, den wir für JSon Serialisieren und Deserialisieren geschrieben haben). –

3

Mit Jettison können Sie Führen Sie Ihre eigenen Zuordnungen von Java zu JSON aus. In diesem Fall könnten Sie das Klassenobjekt der gewünschten Klasse abrufen und dann das von den Methoden getFields, getConstructors, getMethods usw. zurückgegebene Java mithilfe von Jettison zu JSON zuordnen.

0

Um das gleiche zu tun, am Ende habe ich meine eigene Methode geschrieben, dies behandelt nicht alle Fälle, z. wenn eines der erklärten Felder ist eine Karte bricht, aber dies scheint für die meisten gängigen Objekte in Ordnung zu sein:

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

Das abgebildete Tracker gibt, weil, wie ich Beziehungen in Hibernate behandeln; ohne es gibt es eine endlos rekursive Beziehung zwischen Eltern und Kind, z.B. child.getFather().getFirstChild().getFather().getFirstChild().getFather()...

Verwandte Themen