我正在尝试创建一种方法,该方法将在给定URL和JSONArray的情况下发送POST请求。该代码的摘录如下:
URL url = new URL("https://jsonplaceholder.typicode.com/posts");
JSONObject obj = new JSONObject();
obj.put("id", -12);
obj.put("title", "titlevalue");
obj.put("body", "bodyvalue");
JSONArray arr = new JSONArray("[" + obj + "]");
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("charset", "utf-8");
System.out.println(arr.toString());
OutputStreamWriter wr= new OutputStreamWriter(con.getOutputStream(), "UTF-8");
wr.write(arr.toString());
wr.flush();
wr.close();
if (con.getResponseCode() != 201) // make sure request is successful
throw new Exception("Error code " + con.getResponseCode());
String str = new Scanner(con.getInputStream(), "UTF-8").useDelimiter("\\Z").next();
System.out.println(str);
第一个打印语句显示我的输入格式正确
[{
"id": -12,
"title": "titlevalue",
"body": "bodyvalue"
}]
这就是我想要的方式,但是在写入输出流后,第二个打印语句向我表明,它完全没有正确设置为JSON格式,整个位置都有怪异的转义字符,并且没有选择键/值对。
{
"[{\"id\":-12,\"title\":\"titlevalue\",\"body\":\"bodyvalue\"}]": "",
"id": 101
}
开机自检期间我做错了什么吗?
答案 0 :(得分:1)
我认为您的问题可能就在这里:
JSONArray arr = new JSONArray("[" + obj + "]");
我怀疑此时obj
已转换为字符串,而您的JSONArray
仅包含一个字符串。也就是说,"[" + obj + "]"
具有调用obj.toString()
并创建传递给构造函数的单个字符串的作用。
这意味着当您将其写入时,单个字符串的嵌入引号已转义。 System.out.println(arr.toString());
实际上是误导的。您尚未按预期设置对象。
解决方案可能很简单:
--- JSONArray arr =新的JSONArray(obj); ---
JSONArray arr = new JSONArray();
arr.put(obj);
答案 1 :(得分:1)
尝试以下方法:
JSONObject obj = new JSONObject();
obj.put("id", -12);
obj.put("title", "titlevalue");
obj.put("body", "bodyvalue");
JSONArray arr = new JSONArray();
arr.put(obj);
说明:正如Dave所解释的那样,将字符串用“ [”和“]”括起来,以引入转义字符。而是将创建的对象放入数组中。更好的方法是使用GSON或JACKSON进行解析,您可以轻松地在Internet上找到教程。
答案 2 :(得分:0)
我建议您使用GSON库,它非常简单,可以将任何Java对象转换为JSON字符串。
Gson gson = new Gson()
String json = gson.toJson(myObject);