Browse Source

Updated GsonJsonProvider using also a customized Gson object.

pull/190/head
Spyridon Papadopoulos 9 years ago
parent
commit
18ff41336f
  1. 106
      json-path/src/main/java/com/jayway/jsonpath/spi/json/GsonJsonProvider.java

106
json-path/src/main/java/com/jayway/jsonpath/spi/json/GsonJsonProvider.java

@ -14,37 +14,55 @@
*/
package com.jayway.jsonpath.spi.json;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import com.google.gson.internal.LazilyParsedNumber;
import com.jayway.jsonpath.InvalidJsonException;
import com.jayway.jsonpath.JsonPathException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class GsonJsonProvider extends AbstractJsonProvider {
private static final JsonParser parser = new JsonParser();
private static final Gson gson = new GsonBuilder().create();
private static final JsonParser PARSER = new JsonParser();
private final Gson gson;
/**
* Initializes the {@code GsonJsonProvider} using the default {@link Gson} object.
*/
public GsonJsonProvider() {
this(new Gson());
}
/**
* Initializes the {@code GsonJsonProvider} using a customized {@link Gson} object.
*
* @param gson the customized Gson object.
*/
public GsonJsonProvider(final Gson gson) {
this.gson = gson;
}
public Object unwrap(Object o) {
public Object unwrap(final Object o) {
if (o == null) {
return null;
}
if (!(o instanceof JsonElement)) {
return o;
}
@ -64,10 +82,11 @@ public class GsonJsonProvider extends AbstractJsonProvider {
return unwrapNumber(p.getAsNumber());
}
}
return o;
}
private static Number unwrapNumber(Number n) {
private static Number unwrapNumber(final Number n) {
Number unwrapped;
if (n instanceof LazilyParsedNumber) {
@ -85,27 +104,28 @@ public class GsonJsonProvider extends AbstractJsonProvider {
} else {
unwrapped = n;
}
return unwrapped;
}
@Override
public Object parse(String json) throws InvalidJsonException {
return parser.parse(json);
public Object parse(final String json) throws InvalidJsonException {
return PARSER.parse(json);
}
@Override
public Object parse(InputStream jsonStream, String charset) throws InvalidJsonException {
public Object parse(final InputStream jsonStream, final String charset) throws InvalidJsonException {
try {
return parser.parse(new InputStreamReader(jsonStream, charset));
return PARSER.parse(new InputStreamReader(jsonStream, charset));
} catch (UnsupportedEncodingException e) {
throw new JsonPathException(e);
}
}
@Override
public String toJson(Object obj) {
return obj.toString();
public String toJson(final Object obj) {
return gson.toJson(obj);
}
@Override
@ -119,17 +139,17 @@ public class GsonJsonProvider extends AbstractJsonProvider {
}
@Override
public boolean isArray(Object obj) {
public boolean isArray(final Object obj) {
return (obj instanceof JsonArray || obj instanceof List);
}
@Override
public Object getArrayIndex(Object obj, int idx) {
public Object getArrayIndex(final Object obj, final int idx) {
return toJsonArray(obj).get(idx);
}
@Override
public void setArrayIndex(Object array, int index, Object newValue) {
public void setArrayIndex(final Object array, final int index, final Object newValue) {
if (!isArray(array)) {
throw new UnsupportedOperationException();
} else {
@ -143,7 +163,7 @@ public class GsonJsonProvider extends AbstractJsonProvider {
}
@Override
public Object getMapValue(Object obj, String key) {
public Object getMapValue(final Object obj, final String key) {
JsonObject jsonObject = toJsonObject(obj);
Object o = jsonObject.get(key);
if (!jsonObject.has(key)) {
@ -154,10 +174,10 @@ public class GsonJsonProvider extends AbstractJsonProvider {
}
@Override
public void setProperty(Object obj, Object key, Object value) {
if (isMap(obj))
public void setProperty(final Object obj, final Object key, final Object value) {
if (isMap(obj)) {
toJsonObject(obj).add(key.toString(), createJsonElement(value));
else {
} else {
JsonArray array = toJsonArray(obj);
int index;
if (key != null) {
@ -165,6 +185,7 @@ public class GsonJsonProvider extends AbstractJsonProvider {
} else {
index = array.size();
}
if (index == array.size()) {
array.add(createJsonElement(value));
} else {
@ -173,13 +194,11 @@ public class GsonJsonProvider extends AbstractJsonProvider {
}
}
@SuppressWarnings("unchecked")
public void removeProperty(Object obj, Object key) {
if (isMap(obj))
public void removeProperty(final Object obj, final Object key) {
if (isMap(obj)) {
toJsonObject(obj).remove(key.toString());
else {
} else {
JsonArray array = toJsonArray(obj);
int index = key instanceof Integer ? (Integer) key : Integer.parseInt(key.toString());
array.remove(index);
@ -187,22 +206,24 @@ public class GsonJsonProvider extends AbstractJsonProvider {
}
@Override
public boolean isMap(Object obj) {
public boolean isMap(final Object obj) {
// return (obj instanceof JsonObject || obj instanceof Map);
return (obj instanceof JsonObject);
}
@Override
public Collection<String> getPropertyKeys(Object obj) {
public Collection<String> getPropertyKeys(final Object obj) {
List<String> keys = new ArrayList<String>();
for (Map.Entry<String, JsonElement> entry : toJsonObject(obj).entrySet()) {
keys.add(entry.getKey());
}
return keys;
}
@Override
public int length(Object obj) {
public int length(final Object obj) {
if (isArray(obj)) {
return toJsonArray(obj).size();
} else if (isMap(obj)) {
@ -215,32 +236,35 @@ public class GsonJsonProvider extends AbstractJsonProvider {
}
}
}
throw new JsonPathException("length operation can not applied to " + obj != null ? obj.getClass().getName() : "null");
throw new JsonPathException("length operation can not applied to " + obj != null ? obj.getClass().getName()
: "null");
}
@Override
public Iterable<?> toIterable(Object obj) {
public Iterable<?> toIterable(final Object obj) {
JsonArray arr = toJsonArray(obj);
List<Object> values = new ArrayList<Object>(arr.size());
for (Object o : arr) {
values.add(unwrap(o));
}
return values;
}
private JsonElement createJsonElement(Object o) {
private JsonElement createJsonElement(final Object o) {
return gson.toJsonTree(o);
}
private JsonArray toJsonArray(Object o) {
private JsonArray toJsonArray(final Object o) {
return (JsonArray) o;
}
private JsonObject toJsonObject(Object o) {
private JsonObject toJsonObject(final Object o) {
return (JsonObject) o;
}
private JsonElement toJsonElement(Object o) {
private JsonElement toJsonElement(final Object o) {
return (JsonElement) o;
}
}

Loading…
Cancel
Save