我想将Class对象表示为JSON。例如,如果我有类定义如下:
public class MyClass {
String myName;
int myAge;
MyOtherClass other;
}
public class MyOtherClass {
double myDouble;
}
我想从MyClass类型的Class对象中获取以下嵌套JSON:
{
myName: String,
myAge: int,
other: {
myDouble: double;
}
}
编辑:
我不想序列化这些类的实例,我理解如何使用GSON。我想序列化类本身的结构,因此,给定一个专有的类Object,我可以生成JSON,将类的字段递归地分解为标准对象,如String,Double等。
答案 0 :(得分:3)
使用Jettison,您可以将自己的映射从Java转换为JSON。所以在这种情况下,您可以获取所需类的Class对象,然后使用Jettison将getFields,getConstructors,getMethods等方法返回的Java映射到JSON。
答案 1 :(得分:1)
我建议使用杰克逊。 您还可以查看基于Jackson的JSonObjectSerializer类,它可以在oVirt下的engine / backend / manager / module / utils下找到(你可以克隆代码),看看我们在那里如何使用Jackson。 / p>
答案 2 :(得分:0)
期待做同样的事情,最后我开始编写自己的方法,这不能处理所有情况,例如:如果其中一个声明的字段是一个Map,那么这将会破坏,但对于大多数常见对象来说这似乎没问题:
@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;
}
那里的映射跟踪器是因为我如何处理Hibernate中的关系;没有它,父母和孩子之间会有无休止的递归关系,例如child.getFather().getFirstChild().getFather().getFirstChild().getFather()...