2011-07-11 11 views
0

JSONデータをJavaオブジェクトに変換するにはGoogleのGSONライブラリを使用しています。問題は、Java objetのクラス名もJSONデータに渡されているため、文字列としてしか使用できないということです。クラス名が文字列として格納されているときにオブジェクトを宣言する方法を理解できません。GSON:クラス名が文字列に格納されているJavaクラスにJSONデータを入力する

また、データが初期化された後に呼び出す方法も同じです。

ここに関連するコードは、これまでのところです:

request = gson.fromJson(rawData.toString(), JSONRequest.class); 

String method = request.getMethod(); 
String data = request.getData(); 
String dataClass = request.getDataClass(); 

// convert data into an object of dataClass and execute method by passing dataObject 
dataClass dataObject = gson.fromJson(data, dataClass.class); 
result = method(dataObject); 

これは、変換をオブジェクトにデータを達成するために非常に粗製の方法のように思えます。より良い方法がありますか?そうでない場合は、どうすればコードを修正できますか?

答えて

1

元の質問の例のコードでは、dataClass.classは常にString.classになりますが、これは逆シリアル化する正しいターゲットタイプではないでしょう。

私は次のことが実証されたと考えています。 (元の質問にJSONRequestの実装が使用されているかどうか分かりません)

ターゲットタイプが実際にはわからず、既知の親のサブタイプでない場合メソッドを呼び出すにはリフレクションが必要です。 (このことは、ターゲットメソッドは、パラメータを必要としないことを前提としています。)

import java.io.FileReader; 
import java.lang.reflect.Method; 

import com.google.gson.Gson; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 

    // input JSON: 
    // { 
    // "dataClass":"com.stackoverflow.q6647866.MyObject", 
    // "method":"myMethod", 
    // "data":"{\"name\":\"fubar\"}" 
    // } 
    JSONRequest request = gson.fromJson(new FileReader("input.json"), JSONRequest.class); 

    Class targetClass = Class.forName(request.dataClass); 
    System.out.println("targetClass: " + targetClass); 
    Object dataObject = gson.fromJson(request.data, targetClass); 

    Method method = targetClass.getMethod(request.method); 
    method.invoke(dataObject); 
    } 
} 

class JSONRequest 
{ 
    String method; 
    String data; 
    String dataClass; 
} 

class MyObject 
{ 
    String name; 
    public void myMethod() 
    { 
    System.out.println("running my method..."); 
    } 
} 

これは、変換をオブジェクトにデータを達成するための非常に粗な方法のように思えます。より良い方法がありますか?

対象のデータ型と呼び出すメソッドが完全に不明で、着信JSONでのみ提供されている場合とほぼ同じです。

関連する問題