Проблема, связанная с тем, как вы обычно делаете это с помощью Gson, заключается в том, что JSON "args"
- это объект, который, основываясь на ваших примерах, может иметь переменное количество полей (аргументы и их имена).Было бы лучше, если бы "args"
был просто массивом JSON-аргументов метода (без имен аргументов), поскольку вы все равно не сможете использовать имена аргументов при вызове метода.Тогда вы могли бы написать простой класс, такой как:
class MethodCall {
private String method;
private List<String> args;
...
}
, который можно было бы проанализировать из JSON.
Я предполагаю, что вы не можете изменить формат, который вы получаете, хотя,поэтому другой вариант может заключаться в том, чтобы использовать тот же класс, который я перечислил выше, но зарегистрировать для него пользовательский JsonDeserializer
.Это может выглядеть примерно так:
public MethodCall fromJson(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
JsonObject obj = json.getAsJsonObject();
String method = obj.get("method").getAsString();
JsonObject argsObj = obj.getAsJsonObject("args");
List<String> args = new ArrayList<String>();
for(Map.Entry<String,JsonElement> entry : argsObj.entrySet()) {
args.add(entry.getValue().getAsString());
}
return new MethodCall(method, args);
}
Затем вы можете использовать отражение для вызова метода.В идеале, метод, который делает это, будет методом MethodCall
, поэтому после получения объекта MethodCall
вы просто напишите call.callMethod(obj)
, где obj
будет объектом, для которого вы хотите вызвать метод.
Редактировать
Формат JSON, который будет наиболее простым для вызова методов Java, будет выглядеть примерно так:
{
"method":"methodName2",
"args": [
"arg1Value",
"arg2Value",
"arg3Value",
"arg4Value"
]
}
Gson может автоматически преобразовывать массив JSON в List
или массив, который затем можно использовать для вызова метода через отражение.