JSONObject result = new JSONObject();
try {
for (Property property : resourceShape.getProperties()) {
Method getter = ReflectionHelper.findGetterForPropertyName(resource.getClass(), property.getName());
Object value = ReflectionHelper.callGetter(resource, getter);
PropertyDescription propertyDescriptionAnnotation = ReflectionHelper.getAnnotation(getter, PropertyDescription.class);
if (propertyDescriptionAnnotation.expandable()) {
ResourceShape nestedResourceShape = property.getResourceShape();
Assert.isNotNull(nestedResourceShape, "Could not find resource shape definition for: " + property.getName()); //$NON-NLS-1$
result.put(property.getName(), serialize(value, nestedResourceShape));
} else {
result.put(property.getName(), value);