diff options
Diffstat (limited to 'src/main/java/org/geojson/jackson/LngLatAltDeserializer.java')
-rw-r--r-- | src/main/java/org/geojson/jackson/LngLatAltDeserializer.java | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/main/java/org/geojson/jackson/LngLatAltDeserializer.java b/src/main/java/org/geojson/jackson/LngLatAltDeserializer.java new file mode 100644 index 0000000..ff888c6 --- /dev/null +++ b/src/main/java/org/geojson/jackson/LngLatAltDeserializer.java @@ -0,0 +1,69 @@ +package org.geojson.jackson; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import org.geojson.LngLatAlt; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class LngLatAltDeserializer extends JsonDeserializer<LngLatAlt> { + + @Override + public LngLatAlt deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { + if (jp.isExpectedStartArrayToken()) { + return deserializeArray(jp, ctxt); + } + throw ctxt.mappingException(LngLatAlt.class); + } + + protected LngLatAlt deserializeArray(JsonParser jp, DeserializationContext ctxt) throws IOException { + LngLatAlt node = new LngLatAlt(); + node.setLongitude(extractDouble(jp, ctxt, false)); + node.setLatitude(extractDouble(jp, ctxt, false)); + node.setAltitude(extractDouble(jp, ctxt, true)); + List<Double> additionalElementsList = new ArrayList<Double>(); + while (jp.hasCurrentToken() && jp.getCurrentToken() != JsonToken.END_ARRAY) { + double element = extractDouble(jp, ctxt, true); + if (!Double.isNaN(element)) { + additionalElementsList.add(element); + } + } + double[] additionalElements = new double[additionalElementsList.size()]; + for (int i = 0; i < additionalElements.length; i++) { + additionalElements[i] = additionalElementsList.get(i); + } + node.setAdditionalElements(additionalElements); + return node; + } + + private double extractDouble(JsonParser jp, DeserializationContext ctxt, boolean optional) throws IOException { + JsonToken token = jp.nextToken(); + if (token == null) { + if (optional) + return Double.NaN; + else + throw ctxt.mappingException("Unexpected end-of-input when binding data into LngLatAlt"); + } else { + switch (token) { + case END_ARRAY: + if (optional) + return Double.NaN; + else + throw ctxt.mappingException("Unexpected end-of-input when binding data into LngLatAlt"); + case VALUE_NUMBER_FLOAT: + return jp.getDoubleValue(); + case VALUE_NUMBER_INT: + return jp.getLongValue(); + case VALUE_STRING: + return jp.getValueAsDouble(); + default: + throw ctxt.mappingException( + "Unexpected token (" + token.name() + ") when binding data into LngLatAlt"); + } + } + } +} |