Джексон не десериализовал подчеркнутых персонажей должным образом - PullRequest
0 голосов
/ 21 октября 2018

Я использую Джексона для сериализации сущностей клиентов в файлах XML с кодом ниже:

XmlMapper mapper = new XmlMapper();

String exportPath = System.getenv("TFH_HOME") + File.separator + "data" + File.separator + "XML" + File.separator;

mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

List<Customer> customers = customerService.findAllExplicit();

    customers.forEach((customer) -> 
    {
        try 
        {
            mapper.writeValue(new File(exportPath + "customers" + File.separator + customer.getCustomerNumber() + ".xml"), customer);
        }
        catch (IOException ex) 
        {
            logger.error("Error serializing customer " + customer.toString() + " : " + ex.getMessage());
        }
    });

Это прекрасно работает и создает файл XML для каждого клиента со всеми его данными.Проблема состоит в том, что эти данные на французском языке, поэтому содержат акцентированные символы, такие как é.Это код, который я использую для десериализации указанных клиентов:

public void importCustomers()
{
    File customerFolder = new File(exportPath + "customers");

    for (File customerFile : customerFolder.listFiles())
    {
        try 
        {
            String customerXML = inputStreamToString(new FileInputStream(customerFile));

            Customer customer = mapper.readValue(customerXML, Customer.class);

            customer.setId(null);

            customerService.save(customer);
        } 
        catch (IOException ex) 
        {
            logger.error("Error importing customer : " + ex.getMessage());
        }
    }
}

private static String inputStreamToString(InputStream is) throws IOException 
{
    StringBuilder sb = new StringBuilder();
    String line;
    try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) 
    {
        while ((line = br.readLine()) != null)
        {
            sb.append(line);
        }
    }

    return sb.toString();
}

Он работает отлично, за исключением того, что символы é преобразуются в Ã ‰ при десериализации (они сериализуются в порядке, а полученный XML-файл показываетправильные символы).Я знаю, что это связано с кодировкой символов (UTF8 против ISO-8859-2), но я не знаю, как подключить это к механизму десериализации сериала Джексона.

Буду признателен за любую помощь!

Спасибо

1 Ответ

0 голосов
/ 22 октября 2018

В итоге я бросил Джексона и вместо этого использовал класс java.beans.XMLDecoder;.Подчеркнутые символы сохраняются при использовании этого метода.

...