package com.fasterxml.jackson.databind.ext;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;

/**
 * @since 2.8
 */
public class NioPathDeserializer extends StdScalarDeserializer<Path>
{
    private static final long serialVersionUID = 1;

    public NioPathDeserializer() { super(Path.class); }

    @Override
    public Path deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        if (!p.hasToken(JsonToken.VALUE_STRING)) {
// 19-May-2016, tatu: Need to rework as part of exception handling improvements for 2.8;
//    for now use simpler call only because `wrongTokenException()` will mean something
//    different, and mismatch will need different call
//            throw ctxt.wrongTokenException(p, JsonToken.VALUE_STRING, "The value of a java.nio.file.Path must be a string");
            ctxt.reportMappingException(Path.class, p.getCurrentToken());
        }
        final String value = p.getText();
        try {
            URI uri = new URI(value);
            return Paths.get(uri);
        } catch (URISyntaxException e) {
            return (Path) ctxt.handleInstantiationProblem(handledType(), value, e);
        }
    }
}

@@ -1249,16 +1249,55 @@
 Text();%0A
+        if (value.contains(%22:%22)) %7B%0A    
         
@@ -1302,16 +1302,20 @@
   try %7B%0A
+    
         
@@ -1352,24 +1352,28 @@
             
+    
 return Paths
@@ -1391,16 +1391,20 @@
         
+  
+  
 %7D catch 
@@ -1424,24 +1424,28 @@
 eption e) %7B%0A
+    
             
@@ -1512,24 +1512,227 @@
  value, e);%0A
+            %7D%0A        %7D else %7B%0A            // If someone gives us an input with no : at all, treat as local path, instead of failing%0A            // with invalid URI.%0A            return Paths.get(value);%0A
         %7D%0A  

Allow Paths with no :.