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 を指定すると、クラスのフィールドを再帰的に String、Double などの標準オブジェクトに分解する JSON を生成できます。

4

3 に答える 3

3

Jettison使用すると、独自のマッピングを Java から JSON にロールすることができます。したがって、この場合、必要なクラスの Class オブジェクトを取得し、getFields、getConstructors、getMethods などのメソッドによって返された Java を、Jettison を使用して JSON にマップできます。

于 2012-06-19T18:35:58.067 に答える
1

ジャクソンの使用をお勧めします。また、 oVirtの engine/backend/manager/module/utils (コードを git clone できます)で見つけることができる Jackson に基づく JSonObjectSerializer クラスを見て、そこで Jacksonをどのように使用したかを確認することもできます。

于 2012-06-19T18:51:36.437 に答える
0

同じことをしようとして、最終的に私は自分のメソッドを書いてしまいました.これはすべてのケースを処理するわけではありません.たとえば、宣言されたフィールドの1つがマップである場合、これは壊れますが、これはほとんどの一般的なオブジェクトでは問題ないようです:

@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 に答える