Преобразование JSON в XML без преобразования десятичной в научную нотацию - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь преобразовать JSON в XML в промежуточном инструменте. Я использую Jackson библиотеки для этого преобразования. Проблема заключается в том, что для десятичных полей (длиной более 8) в JSON соответствующее значение XML преобразуется в научную запись. Например, 8765431002.13 преобразуется в 8.76543100213E8.

Я могу преобразовать научную нотацию в обычный десятичный формат, если знаю название поля. Но в моем случае приложение промежуточного программного обеспечения не будет знать о поле, являющемся десятичным.

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.dataformat.xml.XmlMapper;


public class JSONDataformat {

       public static void main(String[] args) {
              // TODO Auto-generated method stub
              try {
              //String jsonString = "{\"Field1\":18629920.68,\"Field3\":\"test\", \"Field2\":\"null\"}";          
                ObjectMapper objectMapper = new ObjectMapper();
              ObjectMapper xmlMapper = new XmlMapper();
              JsonNode tree = objectMapper.readTree(jsonString);

              String jsonAsXml = xmlMapper.writer().writeValueAsString(tree);
              System.out.println(jsonAsXml);
              }
              catch(Exception e) {e.printStackTrace(); }

       }

}

выход

<ObjectNode xmlns=""><Field1>1.862992068E7</Field1><Field3>test</Field3><Field2/></ObjectNode>

Я ожидал получить значение <Field1> как 18629920.68 в приведенном выше коде.

1 Ответ

1 голос
/ 21 мая 2019

Вам необходимо включить USE_BIG_DECIMAL_FOR_FLOATS функцию:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);

РЕДАКТИРОВАТЬ

import com.fasterxml.jackson.core.JsonGenerator.Feature;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.IOException;

public class Test {

    public static void main(String[] args) throws IOException {
        String jsonString = "{\"Field1\": 20121220.00,\"Field3\":\"test\", \"Field2\":\"null\"}";

        ObjectMapper jsonMapper = new ObjectMapper();
        jsonMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);

        XmlMapper xmlMapper = new XmlMapper();

        JsonNode tree = jsonMapper.readTree(jsonString);

        String jsonAsXml = xmlMapper.writer().with(Feature.WRITE_BIGDECIMAL_AS_PLAIN).writeValueAsString(tree);
        System.out.println(jsonAsXml);
    }
}

Над печатью кода:

<ObjectNode><Field1>20121220</Field1><Field3>test</Field3><Field2>null</Field2></ObjectNode>
...