java - 使用 JSON 反序列化为 Java 对象?

标签 java json

我必须收到以下 JSON:

{
   "method":"methodName1",
   "args":{
      "arg1Name":"arg1Value",
      "arg2Name":"arg2Value"
   }

}

这是另一个例子:

{
   "method":"methodName2",
   "args":{
      "arg1Name":"arg1Value",
      "arg2Name":"arg2Value"
      "arg3Name":"arg3Value"
      "arg4Name":"arg4Value"
   }

}

我需要解析这些 JSON,以便使用指定的“args”作为参数调用指定的方法。

(对我而言)最简单的方法是使用 JsonParser 获取 JsonElement,然后是 JsonObject,然后提取每个值使用 .get()... 像这样:

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();

}

然后我可以使用适当的参数调用指定的方法(使用 switch)。

我只是想知道是否有更简单(或更漂亮)的方法来实现这一目标。

我可以使用 .fromJson() 来检索一个对象,但我不知道我应该如何创建我的类来这样做(有一些类似 args 的数组而不是所有方法具有相同数量的参数)。

我是 JSON(以及 Java)的新手。

我已经做到了:

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;
    }
}

这似乎可行...但由于我是 Java 的新手,我不确定这是正确的方法。你怎么看?

最佳答案

也许 Gson Map 序列化程序足够聪明,可以反序列化它?

public class MethodCall {
    private String method;
    private Map<String, String> args;
}

(没有时间彻底测试它,但我希望它有效!:))

关于java - 使用 JSON 反序列化为 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3461473/

相关文章:

java - 多个 servlet 是否可以绑定(bind)到同一个数据源 (JNDI)?

javascript - 使用 jquery 渲染 json

javascript - 如何使用 JavaScript 访问 JSON 数据中嵌套数组中的特定元素?

php - 无法在 iOS 中解析从 PHP 获取的 JSON

json - Postgres 多对多 JSON 聚合

java - 泛型和带有 Class.forName 的 asSubClass

Java @Pathparam 与 POST 方法

java - 如何通过数据报套接字发送对象

java - Talend 开放工作室 - 如何进行下一步

java - Jackson 可以使用可自定义的键名序列化为 JSON 吗?