Search code examples
javajsonxmljacksonscientific-notation

Transforming JSON to XML without converting decimal to scientific notation


I am trying to convert JSON to XML in middle ware tool. I am using Jackson libraries to do this transformation. The problem is that for decimal fields (length more than 8) in JSON, the corresponding XML value is converted to scientific notation. For example 8765431002.13 is converted to 8.76543100213E8.

I can convert the scientific notation to normal decimal format if know the name of the field. But in my case, the middleware application will not be aware of field that is coming as decimal.

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(); }

       }

}

Output

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

I expected to get <Field1> value as 18629920.68 in above code.


Solution

  • You need to enable USE_BIG_DECIMAL_FOR_FLOATS feature:

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

    EDIT

    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);
        }
    }
    

    Above code prints:

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