【问题标题】:org.codehaus.jackson.JsonParseException when reading utf-8 file with object mapper (jackson all jar 1.9.0)org.codehaus.jackson.JsonParseException 使用对象映射器读取 utf-8 文件时(jackson all jar 1.9.0)
【发布时间】:2014-04-13 17:09:08
【问题描述】:

我的程序可以不出错地写一个utf-8文件

    public static boolean main(Lesson lesson, int autoSave) throws IOException {
        final ObjectMapper mapper = new ObjectMapper();

        String user = System.getProperty("user.name");
        String s = user.format("C:\\Users\\%s\\Documents", user);
        s = s.replace("\\", "/");

        File dir = new File(String.format(("%s/VocabelTrainer"), s));
        dir.mkdir();

        String path = String.format("%s/VocabelTrainer/%s", s, lesson.getLessonName());
        File file = new File(path);
        if(file.exists() == false || autoSave == 1){
            mapper.writeValue(new FileWriter(path), lesson);
            return true;
        }
        else
            return false;

}

但是当我想读回来时

public class ReadFile {

public static Lesson main(String fileName) throws JsonParseException, JsonMappingException, IOException
{
final ObjectMapper mapper = new ObjectMapper();
Lesson lesson = new Lesson();

String user = System.getProperty("user.name");
String s = String.format("C:\\Users\\%s\\Documents\\VocabelTrainer", user);
s = s.replace("\\", "/");
String path = String.format("%s/%s", s, fileName);
File f = new File(path);

if (f.exists())
    lesson = mapper.readValue(new File(path), Lesson.class);
else
    System.out.println("File does not exist at " + f.toString());

return lesson;
}

我总是收到这个错误

org.codehaus.jackson.JsonParseException: 无效的 UTF-8 中间字节 0x22 在 [来源:C:\Users\Username\Documents\VocabelTrainer\Filename;行:1,列:31] 在 org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433) 在 org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521) 在 org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2830) 在 org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2837) 在 org.codehaus.jackson.impl.Utf8StreamParser._decodeUtf8_2(Utf8StreamParser.java:2625) 在 org.codehaus.jackson.impl.Utf8StreamParser._finishString2(Utf8StreamParser.java:1952) 在 org.codehaus.jackson.impl.Utf8StreamParser._finishString(Utf8StreamParser.java:1905) 在 org.codehaus.jackson.impl.Utf8StreamParser.getText(Utf8StreamParser.java:276) 在 org.codehaus.jackson.map.deser.std.StringDeserializer.deserialize(StringDeserializer.java:26) 在 org.codehaus.jackson.map.deser.std.StringDeserializer.deserialize(StringDeserializer.java:13) 在 org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299) 在 org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 在 org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217) 在 org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:194) 在 org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:30) 在 org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299) 在 org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 在 org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732) 在 org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1817) 在 vocabeltrainer.file.ReadFile.main(ReadFile.java:26) 在 vocabeltrainer.main.FileNameSwing.getFileNames(FileNameSwing.java:232) 在 vocabeltrainer.main.FileNameSwing.(FileNameSwing.java:44) 在 vocabeltrainer.main.Swing.actionPerformed(Swing.java:87) 在 javax.swing.AbstractButton.fireActionPerformed(未知来源) 在 javax.swing.AbstractButton$Handler.actionPerformed(未知来源) 在 javax.swing.DefaultButtonModel.fireActionPerformed(未知来源) 在 javax.swing.DefaultButtonModel.setPressed(未知来源) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知来源) 在 java.awt.Component.processMouseEvent(未知来源) 在 javax.swing.JComponent.processMouseEvent(未知来源) 在 java.awt.Component.processEvent(未知来源) 在 java.awt.Container.processEvent(未知来源) 在 java.awt.Component.dispatchEventImpl(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.LightweightDispatcher.retargetMouseEvent(未知来源) 在 java.awt.LightweightDispatcher.processMouseEvent(未知来源) 在 java.awt.LightweightDispatcher.dispatchEvent(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Window.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.EventQueue.dispatchEventImpl(未知来源) 在 java.awt.EventQueue.access$200(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源)

因为他读到了字母“ß”,这是一个 UTF-8 字母!

我阅读了一些严肃的文章,但我没有找到正确的方法来读取 UTF-8。

谢谢

【问题讨论】:

标签: java json encoding utf-8 jackson


【解决方案1】:

写入文件时不指定编码; JRE的默认文件编码很可能不是UTF-8,因此错误。

而不是使用:

new FileWriter(file)

尝试使用(JDK7):

Files.newBufferedWriter(Paths.get("/path/to/file"), StandardCharsets.UTF_8)

如果是JDK6:

new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF-8"))

同样,为了阅读,请使用Files.newBufferedReader()

【讨论】:

    【解决方案2】:

    我不知道为什么第一个和第二个编码的工作方式不同,因此在创建 Writer/reader 时,您应该始终指定您的编码 (UTF-8)(所有需要字节并给出 char 的东西反其道而行之)

    Write a file in UTF-8 using FileWriter (Java)?

    原来如此

    new OutputStreamWriter(new FileOutputStream(file), "UTF-8")
    

    new InputStreamReader(new FileInputStream(file), "UTF-8")
    

    代替FileReader,FileWriter

    【讨论】:

    • 首先谢谢,现在不抛出异常了!但它返回的不是“ßßßß”,而是“����”
    猜你喜欢
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2014-03-04
    • 2012-01-05
    相关资源
    最近更新 更多