少于 1 分钟阅读

刚参加工作时遇到一个服务端返回的 JSON 字符串无法解析的问题。当时研究了很久都没有找到原因,最后一步步抽丝剥茧发现是由于该字符串中包含 \t (tab)制表符的原因。

问题

服务端返回的 JSON 字符串浏览器无法解析

SyntaxError

JSON.parse("{\"a\":\"\t\"}")
// => SyntaxError: Unexpected token    in JSON
JSON.parse("{\"a\":\"\\t\"}")
// => { a: '\t' }

原因

fastjson-1.1.24 未对特殊字符 \t 转义。不符合RFC 4627 | “JSON 标准”

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class HelloWorld
{
	public static void main (String[] args)
	{
		JSONObject test = new JSONObject();
		test.put("key", "before\tafter");
		String jsonString = JSON.toJSONString(test);
		System.out.println(jsonString);
		// fastjson-1.1.24 => {"key":"before  after"}
		// fastjson-1.1.28 => {"key":"before\tafter"}
	}
}

解决方案

BUG已经在fastjson-1.1.28中修复

通过客户端字符串替换解决该问题

jsonString = jsonString.replace(/\t/g, "\\t");

如何在 Java 代码中导入 jar 包并执行

为了复现该BUG,我可是折腾了好久。由于并没有准备Java Web环境,想要运行起来简直是一波三折。这是我的源代码,jar包、源代码以及构建目录均直接使用项目根目录。

Import-jar-File-Java-Code

# 编译

# 错误写法
javac HelloWorld.java
# => elloWorld.java:1: 错误: 程序包com.alibaba.fastjson不存在
# => import com.alibaba.fastjson.JSON;

# 正确写法
javac -cp fastjson-1.1.24.jar HelloWorld.java
# 运行

# 错误写法
java -cp fastjson-1.1.24.jar HelloWorld
# => 错误: 找不到或无法加载主类 HelloWorld.java 

# 正确写法
# Unix
java -cp .:fastjson-1.1.24.jar HelloWorld
# Windows
java -cp .;fastjson-1.1.24.jar HelloWorld

参考

Import-jar-File-Java-Code

You need to specify the classpath for compilation and at runtime: java -classpath .;swt.jar SWTHelloWorld. Note that the dot is important, otherwise the SWTHelloWorld class won’t get found. (This assumes that you’re using Windows; if you’re on Unix, use a colon instead of a semicolon.)

P.S.

这本该是一篇 2016 年左右写出来的博客(*T_T*)