Java JSON POST格式不正确

Java JSON POST格式不正确,java,json,http,Java,Json,Http,我试图创建一个方法,在给定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("b

我试图创建一个方法,在给定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);
第一个print语句显示输入的格式正确

[{
    "id": -12,
    "title": "titlevalue",
    "body": "bodyvalue"
}]
这就是我想要它的方式,但是在写入outputstream之后,第二个print语句告诉我它的JSON格式根本不正确,整个过程中都有奇怪的转义字符,并且它没有拾取键/值对

{
    "[{\"id\":-12,\"title\":\"titlevalue\",\"body\":\"bodyvalue\"}]": "",
    "id": 101
}

我在文章中是否做错了什么?

我建议您使用GSON库,它非常简单,可以将任何java对象转换为JSON字符串

Gson gson = new Gson()
String json = gson.toJson(myObject);

我建议您使用GSON库,它非常简单,可以将任何java对象转换为JSON字符串

Gson gson = new Gson()
String json = gson.toJson(myObject);

我认为你的问题可能在于:

 JSONArray arr = new JSONArray("[" + obj + "]");
我怀疑此时
obj
被转换为字符串,而您的
JSONArray
只包含一个字符串。也就是说,
“[”+obj+“]”
具有调用
obj.toString()
并创建传递给构造函数的单个字符串的效果

这意味着,当您将其写出时,单个字符串中嵌入的引号将被转义。
System.out.println(arr.toString())实际上具有误导性。您没有按预期设置对象

解决方案可能非常简单:

---JSONArray arr=新JSONArray(obj)---


我认为你的问题可能在于:

 JSONArray arr = new JSONArray("[" + obj + "]");
我怀疑此时
obj
被转换为字符串,而您的
JSONArray
只包含一个字符串。也就是说,
“[”+obj+“]”
具有调用
obj.toString()
并创建传递给构造函数的单个字符串的效果

这意味着,当您将其写出时,单个字符串中嵌入的引号将被转义。
System.out.println(arr.toString())实际上具有误导性。您没有按预期设置对象

解决方案可能非常简单:

---JSONArray arr=新JSONArray(obj)---

请尝试以下内容:

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上轻松找到教程。

尝试以下方法:

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上轻松找到教程。

请解释一下为什么GSON?GSON是一个相当简单的库,它可以自动检测类的结构(本身就是映射、列表、集),所有这些都可以表示为JSON。GSON支持每一个java对象在一行代码中将其转换为JSON,这样就不那么麻烦了。您能解释一下为什么GSON吗?GSON是一个相当简单的库,它可以自动检测类的结构(本身就是映射、列表、集),所有这些都可以表示为JSON。GSON支持每一个java对象在一行代码中将其转换为JSON,这样就不那么麻烦了。我明白了你所说的转义嵌入引号的意思,我之所以这样做是因为JSONArray不接受JSONObject作为参数,也不允许字符串不以方括号开头,因此,我在开头和结尾添加了两个方括号,以确保在构建JSONArray时它是有效的。我试过做你的编辑,也试过obj.toString,但它给了我“必须以“[”开头”的提示错误。为了尝试,我尝试更改它,以便编写JSONObject而不是JSONArray,但出现了相同的奇怪格式。我无法测试可能的解决方案。请通读。这对构造函数参数有一些见解。我明白了转义嵌入引号的意思,这就是我这么做的原因我这样做是因为JSONArray不接受JSONObject作为参数,也不允许字符串不以方括号开头,所以我在开头和结尾添加了两个方括号,以确保在构建JSONArray时它是有效的。我尝试了编辑,也尝试了obj.toString,但它给了我“必须以“[]”错误开头。为了进行尝试,我尝试更改它,以便写入JSONObject而不是JSONArray,但出现了相同的奇怪格式。我无法测试可能的解决方案。请通读。这对构造函数参数有一定的了解。