在后台读取一个文件里的JSON
数据,转换成字符串返回给前端,前端使用JSON.parse
转换JSON
报错。在将JSON
校验和压缩后发现前端还是转换失败。在返回结果的时候可以看见一个小红点
最后排查,不带BOM
的识别是Java
遗留的一个bug
。
解决方案:
1、JSON
文件修改为以UTF-8
无BOM
编码格式
2、使用Apache commons io
提供的BOMInputStream
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
import org.apache.commons.io.input.BOMInputStream;
import java.io.*;
public class ReadFileWithApacheCommonsIO {
public static void main(String[] args) {
File file = new File("path/to/your/file.txt");
try (BOMInputStream bomInputStream = new BOMInputStream(new FileInputStream(file), false);
Reader reader = new InputStreamReader(bomInputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(reader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、对于BOM
,我们需要手动处理,通过InputStreamReader
指定字符编码,并且利用BufferedReader
逐行读取
import java.io.*;
public class ReadFileWithoutBOM {
public static void main(String[] args) {
File file = new File("path/to/your/file.txt");
try (InputStream inputStream = new FileInputStream(file);
Reader reader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(reader)) {
// 检查并跳过BOM
bufferedReader.mark(1);
int charRead = bufferedReader.read();
if (charRead != 0xFEFF) { // 0xFEFF 是UTF-8 BOM
bufferedReader.reset(); // 如果不是BOM,回到开头
}
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}