Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JSON文件写入UTF-8编码_Java_Json_Utf 8 - Fatal编程技术网

Java 将JSON文件写入UTF-8编码

Java 将JSON文件写入UTF-8编码,java,json,utf-8,Java,Json,Utf 8,我正在编写一个方法,将一些JSON写入一个文件,这很好。然而,尽管我已将输出设置为UTF-8,但无法读取英镑和欧元符号 Java代码: Path logFile = Paths.get(this.output_folder + "/" + file.getName().split("\\.")[0] + ".json"); try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8))

我正在编写一个方法,将一些JSON写入一个文件,这很好。然而,尽管我已将输出设置为UTF-8,但无法读取英镑和欧元符号

Java代码:

Path logFile = Paths.get(this.output_folder + "/" + file.getName().split("\\.")[0] + ".json");
try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) {
    File fileDir = new File("test.json");
    Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileDir), "UTF8"));
    ObjectMapper mapper = new ObjectMapper();
    writer.write(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(all_questions));
}
“all_questions”是问题对象的arraylist,由ObjectMapper以JSON格式打印

一些带有磅号的JSON示例如下所示:

{
      "name" : "RegExRule",
      "field" : "Q039_4",
      "rules" : [ ],
      "fileName" : "s1rules_england_en.xml",
      "error" : null,
      "pattern_match" : {
        "$record.ApplicationData.SiteVisit.VisitContactDetails.ContactOther.PersonName.PersonGivenName" : "^[\\u0000-\\u005F\\u0061-\\u007B\\u007d-\\u007f£€]*$"
      }
}
但是,这在记事本++中显示。在氧气中,显示如下:

"pattern_match" : {
        "$record.ApplicationData.SiteVisit.VisitContactDetails.ContactOther.PersonName.PersonGivenName" : "^[\\u0000-\\u005F\\u0061-\\u007B\\u007d-\\u007f£€]*$"
 }

构造
OutputStreamWriter
对象时,需要使用
“UTF-8”
作为字符集名称,而不是
“UTF8”

或者,使用
标准字符集.UTF_8

new OutputStreamWriter(..., StandardCharsets.UTF_8)
Java通常不支持读取/写入BOM,因此如果您希望JSON文件具有UTF-8 BOM,则必须手动写入:

Writer out = ...;
out.write("\uFEFF");
out.write(... json content here ...); 
仅供参考,
PrintWriter
可以为您管理
OutputStreamWriter
FileOutputStream
对象:

Writer out = new PrintWriter(fileDir, "UTF-8");
或:

最后,为什么要使用
Files.newBufferedWriter()
创建
BufferedWriter
而忽略它并手动创建辅助
BufferedWriter
?为什么不直接使用您已有的
BufferedWriter

Path logFile = Paths.get(this.output_folder + "/" + file.getName().split("\\.")[0] + ".json");
try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) {
    writer.write("\uFEFF");
    ObjectMapper mapper = new ObjectMapper();
    writer.write(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(all_questions));
}

记事本++中的编码是否设置为“UTF-8”并显示正确?是的。我想它不在oXygen中,但我希望告诉任何编辑器如何从文件内容本身打开文件?如果它与json/文件本身无关,则应该在问题中添加一个
oXygen
标记-oXygen是否支持UTF-8?我查看时找不到该标记。我发现“Oxygene”…是一个没有UTF8 BOM标记的文件,请尝试在开始处添加魔法字节0xEF、0xBB、0xBF,看看Oxygene是如何读取的。记事本++有UTF8和UTF8WithoutBOM格式,记事本总是用BOM保存UTF8。BOM标记字节是UTF-8=EF、BB、BF/UTF-16BigEndian=FEFF/UTF16LittleEndian=FFFE,非常感谢。我认为我的代码中混合了各种尝试,抱歉搞得一团糟。此外,我尝试了“UTF8”和“UTF-8”,但没有尝试“UTF_8”!。dohhh.@Whome:是的,编码BOM的二进制字节是
0xEF 0xBB 0xBF
(UTF-8)、
0xFE 0xFF
(UTF-16LE)和
0xFF 0xFE
(UTF-16BE),但BOM本身始终是Unicode代码点U+FEFF,因此必须传递给
Writer.write()
因此,当写入输出流时,它会被指定的字符集编码(
'\uFEFF'
->
0xEF 0xBB 0xBF
用于UTF-8)。@Jon:当按名称字符串指定字符集时,必须使用
“UTF-8”
,没有
“UTF8”
“UTF\u 8”
字符集名称
UTF_8
StandardCharsets
类的静态
Charset
字段。@RemyLebeau:Java+10y之后,我不知道Writer IO可以决定写入底层outputstream的最终bom标记字节。我一直使用FileOutputStream引用来写入前导bom字节。Doh。
Writer out = new PrintWriter("test.json", "UTF-8");
Path logFile = Paths.get(this.output_folder + "/" + file.getName().split("\\.")[0] + ".json");
try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) {
    writer.write("\uFEFF");
    ObjectMapper mapper = new ObjectMapper();
    writer.write(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(all_questions));
}