特殊字符转换 -- 特殊字符引起的JSONObject错误

本文解决在textarea中输入回车字符导致后台使用net.sf.json.JSONObject.fromObject方法解析JSON时报错的问题,通过将字符串内的换行符替换为Unicode码,成功转换并解析了含有换行的JSON字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在textarea里 输入回车字符后,后台代码使用net.sf.json.JSONObject中的fromObject方法字符串转JSONObject对象
发现报错:net.sf.json.JSONException: Unterminated string at character 78 of {id:'746',name:'123',pwd:'123',ip:'1.1.1.1
2.2.2.2',log_name:'XXX'}

\r回车 \n换行
使用replace替换字符串内的换行\r为unicode码
s = s.replace("\r", "\\u000D");

\n 换行 ('\u000A')
s = s.replace("\n", "\\u000A");

结果:
转换前
{id:'746',name:'123',pwd:'123',ip:'1.1.1.1
2.2.2.2',log_name:'XXX'}
转换后
{"id":"746","name":"123","pwd":"123","ip":"1.1.1.1\r2.2.2.2","log_name":"XXX"}

 

* @brief 计算并更新cJSON对象的json_length字段 * * 此函数计算给定cJSON对象的JSON字符串长度,并更新其中的json_length字段。 * 它考虑了添加json_length字段本身可能导致的长度变化。 * * @param root 要更新的cJSON对象 * @return int 最终的JSON字符串长度,如果发生错误则返回-1 */ static int updateJsonLength(cJSON *root) { // 计算初始长度 char *initial_json_str = cJSON_PrintUnformatted(root); int initial_length = strlen(initial_json_str); free(initial_json_str); // 添加json_length字段 cJSON_AddNumberToObject(root, "json_length", initial_length); // 计算最终长度 char *final_json_str = cJSON_PrintUnformatted(root); int final_length = strlen(final_json_str); free(final_json_str); // 处理位数变化 int diff = calculateDigitDifference(initial_length, final_length); final_length += diff; cJSON_ReplaceItemInObject(root, "json_length", cJSON_CreateNumber(final_length)); return final_length; } /** * @brief 计算两个整数的位数差 * * 此函数计算两个给定整数的位数差。 * 它使用countDigits函数来确定每个整数的位数, * 然后返回它们的差值(b的位数减去a的位数)。 * * @param a 第一个整数 * @param b 第二个整数 * @return 位数的差值(如果b的位数更多则为正,如果a的位数更多则为负) */ int calculateDigitDifference(int a, int b) { int digitsA = countDigits(a); int digitsB = countDigits(b); return digitsB - digitsA; } /** * @brief 计算一个整数的位数 * * 此函数确定给定整数的位数。 * 它将零作为特殊情况处理(认为有一位), * 并对负数使用绝对值。 * * @param n 要计算位数的整数 * @return 整数的位数 */ int countDigits(int n) { if (n == 0) return 1; // 特殊情况:0被认为有1位 int count = 0; n = abs(n); // 处理负数 while (n > 0) { n /= 10; // 移除最后一位 count++; } return count; }" 请求数据格式(JSON): { "id": "<string>", "action": "<string>", "params": {<JSONObject>}, "json_length": <integer> }
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值