客户端通过HTTP PUT向我发送JSON文件,这是文件:
{
"nomPers": "Testworking",
"prenomPers": "WorkingTest",
"loginPers": "Work",
"pwdPers": "Ing",
"active": true
},
我正在使用HTTPServlet作为WebService框架,并使用org.json库与Json一起工作。我也在使用Tomcat服务器。由于Tomcat无法为此HTTP动词创建参数映射,因此我必须使用JSON对象。
所以我进行了一些搜索并尝试,但是仍然无法正常工作,这是我的代码:
@Override
public void doPut(HttpServletRequest request, HttpServletResponse response) {
// this parses the incoming json to a json object.
JSONObject jObj = new JSONObject(request.getParameter("jsondata"));
Iterator<String> it = jObj.keys();
while(it.hasNext())
{
String key = it.next(); // get key
Object o = jObj.get(key); // get value
System.out.println(key + " : " + o); // print the key and value
}
因此,我将传入的Json解析为要使用的Json对象,然后创建一个Iterator以能够遍历此对象并获取和打印每个键/值对的数据。
问题是我收到NullPointerException错误。
我猜这是因为request.getParameter(“ jsondata”)。看来我没有任何参数。我想我必须根据通过请求馈入JSONObject构造函数的数据创建一个字符串,但是我不知道如何实现这一点。
答案 0 :(得分:2)
我认为客户端在请求的主体中而不是在参数中向您发送JSON数据。因此,您尝试解析为JSON数据的参数将始终为null
。要完成您的任务,您首先必须获取主体请求,然后将其解析为JSON。例如,您可以使用以下方法将主体转换为String:
public static String getBody(HttpServletRequest request) {
String body = null;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
// throw ex;
return "";
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
}
}
}
body = stringBuilder.toString();
return body;
}
因此,您的方法将变为:
@Override
public void doPut(HttpServletRequest request, HttpServletResponse response) {
// this parses the incoming JSON from the body.
JSONObject jObj = new JSONObject(getBody(request));
Iterator<String> it = jObj.keys();
while(it.hasNext())
{
String key = it.next(); // get key
Object o = jObj.get(key); // get value
System.out.println(key + " : " + o); // print the key and value
}
...
答案 1 :(得分:1)
显然,您的客户端正在将json字符串作为请求正文发送,由于从request.getParameter(“ jsondata”)获取它时,您将获得null。
在这种情况下,您需要从request.getInputStream()中选择请求正文数据,因此更新后的方法应该是这样的
@Override
public void doPut(HttpServletRequest request, HttpServletResponse response) {
String jsonBody = new BufferedReader(new InputStreamReader(request.getInputStream())).lines().collect(
Collectors.joining("\n"));
if (jsonBody == null || jsonBody.trim().length() == 0) {
// return error that jsonBody is empty
}
// this parses the incoming json to a json object.
JSONObject jObj = new JSONObject(jsonBody);
Iterator<String> it = jObj.keys();
while (it.hasNext()) {
String key = it.next(); // get key
Object o = jObj.get(key); // get value
System.out.println(key + " : " + o); // print the key and value
}
}
希望这会有所帮助。
答案 2 :(得分:0)
使用下面的解析器和JsonObject来获取JsonObject形式的数据。
这些类在gson-2.8.5.jar中可用,导入此jar,然后使用 gson libray。
JsonParser parser = new JsonParser();
JsonObject o = parser.parse(request.getParameter("jsondata"));
您可以从JsonObject获取keySet,然后使用Iterator对其进行迭代。
希望这对您有帮助!