Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -64,10 +82,11 @@ public Object unwrap(Object o) {
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) {
Expand All @@ -85,27 +104,28 @@ private static Number unwrapNumber(Number n) {
} 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
Expand All @@ -119,31 +139,31 @@ public Object createMap() {
}

@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 {
JsonArray arr = toJsonArray(array);
if (index == arr.size()){
if (index == arr.size()) {
arr.add(createJsonElement(newValue));
}else {
} else {
arr.set(index, createJsonElement(newValue));
}
}
}

@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)) {
Expand All @@ -154,17 +174,18 @@ public Object getMapValue(Object obj, String key) {
}

@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) {
index = key instanceof Integer ? (Integer) key : Integer.parseInt(key.toString());
} else {
index = array.size();
}

if (index == array.size()) {
array.add(createJsonElement(value));
} else {
Expand All @@ -173,36 +194,36 @@ public void setProperty(Object obj, Object key, Object value) {
}
}



@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);
}
}

@Override
public boolean isMap(Object obj) {
//return (obj instanceof JsonObject || obj instanceof Map);
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)) {
Expand All @@ -215,32 +236,35 @@ public int length(Object obj) {
}
}
}
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;
}
}