I must receive the following JSON:
{
"method":"methodName1",
"args":{
"arg1Name":"arg1Value",
"arg2Name":"arg2Value"
}
}
Here's another example:
{
"method":"methodName2",
"args":{
"arg1Name":"arg1Value",
"arg2Name":"arg2Value"
"arg3Name":"arg3Value"
"arg4Name":"arg4Value"
}
}
I need to parse those JSONs in order to call the specified method with the specified "args" as parameters.
The easy way (for me) would be to use a JsonParser to get a JsonElement, then a JsonObject and then extract each value using .get()... something like this:
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(jsonString);
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
String method = jsonObject.get("method").getAsString();
JsonObject jsonArgs = jsonObject.getAsJsonObject("args");
String arg1 = jsonArgs.get("arg1Name").getAsString();
String arg2 = jsonArgs.get("arg2Name").getAsString();
}
And then I could call the specified method with the appropriate arguments (using a switch).
I was just wondering if there would be an easier (or prettier) way to achieve this.
I could use .fromJson() to retrieve an object instead, but I don't know how I should create my class to do so (there's something like an array of args and not all methods have the same number of args).
I'm new to JSON (and to Java as well).
I've managed to do this:
import lotus.domino.*;
import com.google.gson.*;
import java.io.*;
import java.lang.reflect.Method;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
String jsonReceived = "{\"method\":\"methodName\",\"args\":{\"arg1Name\":\"arg1Value\",\"arg2Name\":\"arg2Value\"}}";
Gson gson = new Gson();
MethodCall mc = gson.fromJson(jsonReceived, MethodCall.class);
JavaAgent ja = new JavaAgent();
Method method = getClass().getMethod(mc.getMethod(), MethodCall.class);
String s = (String)method.invoke(ja, mc);
PrintWriter pw = getAgentOutput();
pw.println(s);
} catch(Exception e) {
e.printStackTrace();
}
}
public String methodName(MethodCall mc) {
String s = mc.getArgs().get("arg1Name") + " " + mc.getArgs().get("arg2Name");
return s;
}
}
import java.util.*;
public class MethodCall {
private String method;
private Map<String, String> args;
public String getMethod() {
return method;
}
public Map<String, String> getArgs() {
return args;
}
}
It seems to work... but since I'm new to Java, I'm not sure that's the proper way to do it. What do you think?