从字符串中获取JSONObject

13

在servlet中,我如何从HttpServletRequest中获取一个JSONObject?


2
你有搜索、阅读或尝试过任何方法吗? - BoltClock
@Bozho 说得很好。Java有很多JSON库,我预计其中许多都使用了那个类名。 - Stephen C
如果有疑问,请假设它是来自json.org的参考JSON库。 - Erich Kitzmueller
5个回答

17

非常简单:

JSONObject o = new JSONObject(request.getParameter("WHATEVER"));

编辑:由于您使用json-lib,因此它是

JSONObject o = (JSONObject) JSONSerializer.toJSON(request.getParameter("WHATEVER"));  

为您而服务。


3
JSONObject没有任何接受String参数的构造函数。你在使用哪个API? - Anil Bharadia
我正在使用来自json.org的JSON库。 - Erich Kitzmueller

2

看起来你一定在使用 net.sf.json.JSONObject 版本的 JSONObject (这不是json.org的版本)

对于 net.sf.json.JSONObject 版本,仅需使用:

JSONObject.fromObject(Object obj)

其中 obj 可以是以下两种格式之一:

  • 一个有效的 JSON 格式字符串
  • 一个具有 getter 和 setter 方法的 Bean POJO。

1

请参阅JSONObject(java.lang.String)。如果您传递的是有效的JSON字符串,则会创建一个JSONObject对象。构造函数会抛出JSONException异常,因此您需要处理它。如果您发送无效的JSON,则同样适用。

这实际上取决于您正在做什么。在大多数情况下,JSONObject将使用bean getter来创建您的JSON对象(如果您将bean传递给构造函数)。否则,您可以传递一个对象以及一个名称字符串数组。在这里,JSONObject将使用反射来确定对象的公共成员。然后,它将使用您提供的名称作为此对象的键。

JSONObject 可以轻松处理任何类型为 Map 的对象。但如果您的对象是一个 List,则需要使用 JSONArray。另一个问题是,如果您的 Map 包含一个 List,那么由于某种原因,JSONObject 无法确定它是一个 List,并且将使用 List 的标准字符串表示形式(这不是您想要的)。唯一处理该问题的方法是迭代 Map 并手动构建 JSONObject

至于您的问题,我假设您有一个 servlet,其中包含一个将返回 JSON 的操作。在这种情况下,创建一个新的 JSONObject,并使用 PrintWriterjsonObject.toString() 输出您的 JSON。


0

你正在以稍微困难的方式进行操作。肯定有更简单的方法来完成这个任务。只需将其作为普通请求参数发送,而不是作为JSON。您可以使用jQuery.serialize()将所有表单字段收集为参数。以下是JSP应该如何开始的示例:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Test</title>
        <script src="http://code.jquery.com/jquery-latest.min.js"></script>
        <script>
            $(document).ready(function() {
                $('#form').submit(function() {
                    $form = $(this);
                    $.post($form.attr('action'), $form.serialize(), function(response) {
                        alert(response); // "OK"
                    });
                    return false;
                });        
            });
        </script>
    </head>
    <body>
        <form id="form" action="register" method="post">
            <input type="text" name="username">
            <input type="password" name="password">
            <input type="submit">
        </form>
    </body>
</html>

下面是监听/register/* url-pattern的Servlet 示例:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println(username + "," + password);
    response.getWriter().write("OK"); // You can write JSON string here.
}

使用jQuery表单插件,它会更加透明。

            $(document).ready(function() {
                $('#form').ajaxForm(function(response) {
                    alert(response); // "OK" 
                });        
            });

为了从Servlet回应jQuery,如果您返回真正的JSON数据则会更容易。例如:
Map<String, Object> data = new HashMap<String, Object>();
if (userDAO.exist(username)) {
    data.put("success", false);
    data.put("message", "Username in use, please choose another");
} else {
    userDAO.create(username, password);
    data.put("success", true);
    data.put("message", "User successfully registered");
}
response.setContentType("application/json");
response.getWriter().write(new Gson().toJson(data)); // Gson = Google Gson.

然后用jQuery:

        $(document).ready(function() {
            $('#form').ajaxForm(function(data) {
                $('#message').addClass(data.success ? 'success' : 'error').text(data.message).show();
            });        
        });

1
这个问题与jQuery和JavaScript完全无关,这个答案是离题的。 - Pavel Sedek

0

GSON是一个相当不错的基于Java的JSON库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接