从字符串中获取 JSONObject

Posted

技术标签:

【中文标题】从字符串中获取 JSONObject【英文标题】:Getting JSONObject from String 【发布时间】:2011-03-25 18:04:37 【问题描述】:

如何在 servlet 中从 HttpServletRequest 获取 JSONObject

【问题讨论】:

你搜索、阅读、尝试过什么吗? @Bozho 有一个很好的观点。有许多用于 Java 的 JSON 库,我希望它们中的许多都使用该类名。 如果有疑问,假设它是来自 json.org 的参考 JSON 库 【参考方案1】:

很简单:

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

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

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

为你。

【讨论】:

JSONObject 没有任何带有 String 参数的构造函数,您使用的是哪个 API?? 我正在使用来自 json.org 的 JSON 库。【参考方案2】:

看来您必须使用net.sf.json.JSONObject 版本的 JSONObject (这不是 json.org 版本)。

net.sf.json.JSONObject 版本只需使用

JSONObject.fromObject(Object obj)

obj 在哪里

有效的 JSON 格式字符串 一个带有 getter 和 setter 的 Bean POJO。

【讨论】:

【参考方案3】:

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,该 servlet 的操作将返回 JSON。在这种情况下,创建一个新的JSONObject 并使用PrintWriterjsonObject.toString() 来输出您的JSON。

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

你这样做有点困难。当然有更简单的方法可以做到这一点。只需作为普通请求参数发送,而不是作为 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>

下面是侦听url-pattern/register/* 的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 form 插件会更加透明。

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

【讨论】:

这个问题与jQuery和javascript完全无关,这个答案是OT。

以上是关于从字符串中获取 JSONObject的主要内容,如果未能解决你的问题,请参考以下文章

JSON 常用操作

java操作json

java 怎么获取post 中的json参数

go中parsefrom怎么接受application/json的参数

如果字符串是“[]”,我如何控制一个空的 JsonArray [重复]

jsonObject关于xml,json,bean之间的转换关系