banner
指数爆炸

指数爆炸

我做了对饭 !
github
bilibili

在將字符串轉換為 JSON 之前,請多做一步。

問題#

下面這段程式碼乍一看天衣無縫:

// 定義格式
final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("application/json; charset=UTF-8");
// 創建對象
final OkHttpClient client = new OkHttpClient();

// 此處的 answer 可以是任意的字符串
String reqData = "{\n" +
        "  \"req_data\": {\n" +
        "    \"text\": \"" +
        answer +
        "\\n\",\n" +
        "    \"image_ids\": [],\n" +
        "    \"mentioned_user_ids\": []\n" +
        "  }\n" +
        "}";

// 將 reqData 傳入作為請求體
Request request = new Request.Builder()
        .url("https://api.zsxq.com/v2/topics/" + t.getTopicId() + "/comments")
        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, reqData))
        .addHeader("cookie", cookie)
        .addHeader("Content-type", "application/json; charset=UTF-8")
        .build();

但是如果一旦 answer 裡有換行

answer = "嘉興大學是一所綜合性大學。\n\n嘉興大學設有本科……";

那最終轉換出來的 reqData 就會有問題:

{
  "req_data": {
    "text": "嘉興大學是一所綜合性大學。

嘉興大學設有本科……\n",
    "image_ids": [],
    "mentioned_user_ids": []
  }
}

明顯這段 json 的格式是有問題的

解決辦法#

我們期望的 reqData 是這樣的:

{
  "req_data": {
    "text": "嘉興大學是一所綜合性大學。\n\n嘉興大學設有本科……\n",
    "image_ids": [],
    "mentioned_user_ids": []
  }
}

所以我們要修改 answer:

answer = answer.replace("\n", "\\n");

String reqData = "{\n" +
        "  \"req_data\": {\n" +
        "    \"text\": \"" +
        answer +
        "\\n\",\n" +
        "    \"image_ids\": [],\n" +
        "    \"mentioned_user_ids\": []\n" +
        "  }\n" +
        "}";
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。