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.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
@ -38,7 +39,33 @@ SOFTWARE.
*/
public class JSONPointer {
private List<String> refTokens;
private static final String ENCODING = "utf-8";
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
@ -59,7 +86,7 @@ public class JSONPointer {
if (pointer.startsWith("#/")) {
pointer = pointer.substring(2);
try {
pointer = URLDecoder.decode(pointer, "utf-8");
pointer = URLDecoder.decode(pointer, ENCODING);
} catch (UnsupportedEncodingException 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) {
return token.replace("~1", "/").replace("~0", "~")
.replace("\\\"", "\"")
@ -122,4 +153,33 @@ public class JSONPointer {
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);
}
}
}