GSON: ввод данных JSON в класс Java, где имя класса хранится в строке - PullRequest
0 голосов
/ 11 июля 2011

Я использую библиотеку Google GSON для преобразования данных JSON в объекты Java. Проблема заключается в том, что имя класса Java-объекта также передается в данных JSON, поэтому оно доступно только в виде строки. Я не слишком знаком с Java, поэтому не понимаю, как объявить объект, когда имя класса хранится в виде строки.

Кроме того, то же самое относится и к методу, который я буду вызывать после инициализации данных.

Вот соответствующий код:

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 Ответ

1 голос
/ 12 июля 2011

С примером кода в исходном вопросе 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...