Example:
class Example {
@SerializedName("exampleField")
public JSONObject exampleField = new JSONObject("{\"name\":\"Nick\"}");
}
Log.e(TAG,gson.toJson(new Example()))
result:
"exampleField": {
"nameValuePairs": {
"name": "Nick"
}
}
expected Result:
"exampleField": {
"name": "Nick"
}
Use com.google.gson.JsonObject not org.json.JSONObject.
Or write a TypeAdapterFactory that can handle org.json* types, but using Gson's own types seems a lot easier.
with JsonObject my result is
"exampleField": {
"members": {
"name": "Nick"
}
}
instead of the expected result.
Can I create a JsonObject without any LinkedTreeMap or similar?
GsonBuilder registerTypeAdapter
new GsonBuilder()
.registerTypeAdapter(JSONObject.class, JSONObjectAdapter.sInstance)
.registerTypeAdapter(JSONArray.class, JSONArrayAdapter.sInstance)
static class JSONObjectAdapter implements JsonSerializer<JSONObject>, JsonDeserializer<JSONObject> {
public static JSONObjectAdapter sInstance = new JSONObjectAdapter();
@Override
public JsonElement serialize(JSONObject src, Type typeOfSrc, JsonSerializationContext context) {
if (src == null) {
return null;
}
JsonObject jsonObject = new JsonObject();
Iterator<String> keys = src.keys();
while (keys.hasNext()) {
String key = keys.next();
Object value = src.opt(key);
JsonElement jsonElement = context.serialize(value, value.getClass());
jsonObject.add(key, jsonElement);
}
return jsonObject;
}
@Override
public JSONObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json == null) {
return null;
}
try {
return new JSONObject(json.toString());
} catch (JSONException e) {
e.printStackTrace();
throw new JsonParseException(e);
}
}
}
static class JSONArrayAdapter implements JsonSerializer<JSONArray>, JsonDeserializer<JSONArray> {
public static final JSONArrayAdapter sInstance = new JSONArrayAdapter();
@Override
public JsonElement serialize(JSONArray src, Type typeOfSrc, JsonSerializationContext context) {
if (src == null) {
return null;
}
JsonArray jsonArray = new JsonArray();
for (int i = 0; i < src.length(); i++) {
Object object = src.opt(i);
JsonElement jsonElement = context.serialize(object, object.getClass());
jsonArray.add(jsonElement);
}
return jsonArray;
}
@Override
public JSONArray deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json == null) {
return null;
}
try {
return new JSONArray(json.toString());
} catch (JSONException e) {
e.printStackTrace();
throw new JsonParseException(e);
}
}
}
GsonBuilder registerTypeAdapter
new GsonBuilder() .registerTypeAdapter(JSONObject.class, JSONObjectAdapter.sInstance) .registerTypeAdapter(JSONArray.class, JSONArrayAdapter.sInstance)static class JSONObjectAdapter implements JsonSerializer<JSONObject>, JsonDeserializer<JSONObject> { public static JSONObjectAdapter sInstance = new JSONObjectAdapter(); @Override public JsonElement serialize(JSONObject src, Type typeOfSrc, JsonSerializationContext context) { if (src == null) { return null; } JsonObject jsonObject = new JsonObject(); Iterator<String> keys = src.keys(); while (keys.hasNext()) { String key = keys.next(); Object value = src.opt(key); JsonElement jsonElement = context.serialize(value, value.getClass()); jsonObject.add(key, jsonElement); } return jsonObject; } @Override public JSONObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json == null) { return null; } try { return new JSONObject(json.toString()); } catch (JSONException e) { e.printStackTrace(); throw new JsonParseException(e); } } } static class JSONArrayAdapter implements JsonSerializer<JSONArray>, JsonDeserializer<JSONArray> { public static final JSONArrayAdapter sInstance = new JSONArrayAdapter(); @Override public JsonElement serialize(JSONArray src, Type typeOfSrc, JsonSerializationContext context) { if (src == null) { return null; } JsonArray jsonArray = new JsonArray(); for (int i = 0; i < src.length(); i++) { Object object = src.opt(i); JsonElement jsonElement = context.serialize(object, object.getClass()); jsonArray.add(jsonElement); } return jsonArray; } @Override public JSONArray deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json == null) { return null; } try { return new JSONArray(json.toString()); } catch (JSONException e) { e.printStackTrace(); throw new JsonParseException(e); } } }
NB
Most helpful comment
Use
com.google.gson.JsonObjectnotorg.json.JSONObject.