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" +
        "}";
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。