2012-06-19 20 views
5

Chciałbym reprezentować obiekt klasy jako JSON. Na przykład, jeśli mam defintions klasy następująco:Jak utworzyć reprezentację JSON klasy Java?

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

public class MyOtherClass { 
    double myDouble; 
} 

Chciałbym uzyskać następujący zagnieżdżone JSON z obiektu klasy typu MojaKlasa:

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

EDIT:

Nie chcę serializować wystąpień tych klas. Rozumiem, jak to zrobić w usłudze GSON. Chcę serializować strukturę samej klasy, tak, że biorąc pod uwagę zastrzeżony obiekt klasy I, mogę wygenerować JSON, który rozkłada pola klasy rekursywnie na standardowe obiekty, takie jak String, Double, itp.

Odpowiedz

1

Polecam używać Jackson. Możesz także rzucić okiem na klasę JSonObjectSerializer opartą na Jacksonie, którą można znaleźć pod adresem oVirt pod silnikiem/backend/manager/module/utils (możesz skasować kod) i zobaczyć, jak użyliśmy tam Jacksona.

+0

Problem z tym wszystkim polega na tym, że nie mogę uzyskać typu pola, co jest dla mnie najważniejszą częścią. –

+1

@hatboysam - Jackson pozwala ci serializować/deserializować także typy pól. Zobacz pracę, którą wykonaliśmy na stronie www.ovirt.org (pobierz kod, spójrz na silnik/backend/manager/modules/utils - zobaczysz kod napisany dla serializowania i deserializacji JSon). –

3

Z Jettison, można przetasuj własne odwzorowania z Javy na JSON. Tak więc w tym przypadku można uzyskać obiekt Class klasy, którą chcesz, a następnie mapować Java zwróconą przez metody getFields, getConstructors, getMethods itp. Do JSON przy użyciu Jettison.

0

Po zrobieniu tego samego, na końcu napisałem własną metodę, to nie zajmuje się wszystkimi przypadkami, np. jeśli jeden z deklarowanych dziedzin jest mapa to złamie, ale to wydaje się być w porządku dla najczęściej spotykanych obiektów:

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

mapowany tracker istnieje, ponieważ, jak sobie radzić relacje w hibernacji; bez niego istnieje nieskończenie rekursywna relacja między rodzicem a dzieckiem, np. child.getFather().getFirstChild().getFather().getFirstChild().getFather()...

Powiązane problemy