I should get the following JSON:
{ "method":"methodName1", "args":{ "arg1Name":"arg1Value", "arg2Name":"arg2Value" } }
Here is another example:
{ "method":"methodName2", "args":{ "arg1Name":"arg1Value", "arg2Name":"arg2Value" "arg3Name":"arg3Value" "arg4Name":"arg4Value" } }
I need to parse these JSONs to call the specified method with the specified "args" as parameters.
An easy way (for me) would be to use JsonParser to get a JsonElement , then a JsonObject , and then retrieve each value with .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 switch ).
I'm just wondering if there will be an easier (or more beautiful) way to achieve this.
I could use .fromJson() to retrieve the object instead, but I don't know how I should create my class for this (there is something like an array of arguments, and not all methods have the same number of arguments).
I am new to JSON (and Java).
I 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; } }
This seems to work ... but since I'm new to Java, I'm not sure if this is the right way to do this. What do you think?