1
0
Fork 0
mirror of https://github.com/ethauvin/JSON-java.git synced 2025-06-17 07:50:52 -07:00

added builder class for JSONPointer, and implemented toString() and toURIFragment()

This commit is contained in:
Bence Erős 2016-05-03 23:18:05 +02:00
parent cbb1546c53
commit d833c2d8de

View file

@ -5,6 +5,7 @@ import static java.util.Collections.emptyList;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -37,8 +38,34 @@ SOFTWARE.
* <a href="https://tools.ietf.org/html/rfc6901">RFC 6901</a>. * <a href="https://tools.ietf.org/html/rfc6901">RFC 6901</a>.
*/ */
public class JSONPointer { public class JSONPointer {
private static final String ENCODING = "utf-8";
private List<String> refTokens; public static class Builder {
private final List<String> refTokens = new ArrayList<String>();
public Builder append(String token) {
refTokens.add(token);
return this;
}
public JSONPointer build() {
return new JSONPointer(refTokens);
}
public Builder append(int arrayIndex) {
refTokens.add(String.valueOf(arrayIndex));
return this;
}
}
public static Builder builder() {
return new Builder();
}
private final List<String> refTokens;
/** /**
* Pre-parses and initializes a new {@code JSONPointer} instance. If you want to * Pre-parses and initializes a new {@code JSONPointer} instance. If you want to
@ -59,7 +86,7 @@ public class JSONPointer {
if (pointer.startsWith("#/")) { if (pointer.startsWith("#/")) {
pointer = pointer.substring(2); pointer = pointer.substring(2);
try { try {
pointer = URLDecoder.decode(pointer, "utf-8"); pointer = URLDecoder.decode(pointer, ENCODING);
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -74,6 +101,10 @@ public class JSONPointer {
} }
} }
public JSONPointer(List<String> refTokens) {
this.refTokens = refTokens;
}
private String unescape(String token) { private String unescape(String token) {
return token.replace("~1", "/").replace("~0", "~") return token.replace("~1", "/").replace("~0", "~")
.replace("\\\"", "\"") .replace("\\\"", "\"")
@ -122,4 +153,33 @@ public class JSONPointer {
throw new JSONPointerException(format("%s is not an array index", indexToken), e); throw new JSONPointerException(format("%s is not an array index", indexToken), e);
} }
} }
@Override
public String toString() {
StringBuilder rval = new StringBuilder("");
for (String token: refTokens) {
rval.append('/').append(escape(token));
}
return rval.toString();
}
private String escape(String token) {
return token.replace("~", "~0")
.replace("/", "~1")
.replace("\\", "\\\\")
.replace("\"", "\\\"");
}
public String toURIFragment() {
try {
StringBuilder rval = new StringBuilder("#");
for (String token : refTokens) {
rval.append('/').append(URLEncoder.encode(token, ENCODING));
}
return rval.toString();
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
} }