2012-06-19 1 views
5

クラスのオブジェクトをJSONとして表現するのが好きです。私はクラスdefintionsを持っている場合たとえば、次のように:Javaクラスの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; 
    } 
} 

EDIT:

私はこれらのクラスのインスタンスを直列化したくないので、私はGSONでそれを行う方法を理解しています。私は、クラス自体の構造をシリアル化したいので、独自のクラスObjectを与えられたら、クラスのフィールドを再帰的にString、Doubleなどの標準オブジェクトに分解するJSONを生成することができます。

答えて

1

ジャクソンを使用することをお勧めします。 engine/backend/manager/module/utilsの下にあるoVirtにあるJacksonに基づいたJSonObjectSerializerクラスもご覧になれます(コードを複製することができます)。

+0

これらのすべての問題は、フィールドタイプを取得できないことです。これは私にとって最も重要な部分です。 –

+1

@hatboysam - ジャクソンは、フィールド型もシリアライズ/デシリアライズしましょう。 www.ovirt.orgで行った作業を参照してください(コードを入手し、engine/backend/manager/modules/utilsを見てください - JSonのシリアライズとデシリアライズのためのコードをご覧ください)。 –

3

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

0

最終的に私は自分の方法を書いていましたが、これはすべてのケースを処理しません。宣言されたフィールドの一つが地図である場合、これは壊れますが、これは最も一般的なオブジェクトのために大丈夫であるように思わ:

@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; 
} 

ので、私は休止状態での関係をどのように処理するかのがマッピングされたトラッカー。それがなければ、親と子との間に無限に再帰的な関係が存在する。 child.getFather().getFirstChild().getFather().getFirstChild().getFather()...

関連する問題