如何将Java类制作成JSON表示形式?

6

我可以将一个类对象表示为 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来做到这一点。 我想序列化类本身的结构,以便在给定专有类对象的情况下,可以将类的字段递归地拆分为标准对象,例如字符串、双精度等,然后生成JSON。

3个回答

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

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

所有这些问题的关键在于我无法获取字段类型,这对我来说是最重要的部分。 - Sam Stern
1
@hatboysam - Jackson允许您序列化/反序列化字段类型。请查看我们在www.ovirt.org上的工作(获取代码,查看engine/backend/manager/modules/utils - 您将看到我们为JSon序列化和反序列化编写的一些代码)。 - Yair Zaslavsky

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接