6

我想将 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 等。

4

3 回答 3

3

使用Jettison,您可以将自己的映射从 Java 滚动到 JSON。因此在这种情况下,您可以获取所需类的 Class 对象,然后使用 Jettison 将 getFields、getConstructors、getMethods 等方法返回的 Java 映射到 JSON。

于 2012-06-19T18:35:58.067 回答
1

我会推荐使用杰克逊。您还可以查看基于 Jackson 的 JSonObjectSerializer 类,该类可以在oVirt的 engine/backend/manager/module/utils 下找到(您可以 git clone 代码)并了解我们如何在那里使用 Jackson。

于 2012-06-19T18:51:36.437 回答
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()...

于 2016-06-22T15:08:08.390 回答