如何制作Java类的JSON表示?

时间:2012-06-19 18:30:00

标签: java json class

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

3 个答案:

答案 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()...