从字符串中获取 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
在哪里
【讨论】:
【参考方案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
并使用PrintWriter
和jsonObject.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的主要内容,如果未能解决你的问题,请参考以下文章
go中parsefrom怎么接受application/json的参数