使用 gson.toJson 添加到 "map" 键序列化嵌套 org.json.JSONObject
Serializing nested org.json.JSONObject using gson.toJson adding into "map" key
在我的代码中,我需要将 org.json.JSONObject
添加到另一个使用 gson.toJson
序列化的对象。然而,当这个对象被序列化时,JSONObject
中的值被 gson 自己嵌套到一个映射键中。例如,
public class New {
private static final Gson gson = new GsonBuilder().disableHtmlEscaping().create();
public static void something(User user) throws Exception {
try {
ObjectWriter ow = new ObjectMapper().writer();
String json = ow.writeValueAsString(user);
JSONObject maskedUser = new JSONObject(json);
Nesting testing = new Nesting(maskedUser, "someting");
String something = gson.toJson(testing);
System.out.println(something);
} catch (Exception e) {
throw e;
}
}
public static void main(String[] args) throws Exception {
User user = new User("a", "b", "c");
something(user);
}
}
我收到输出 JSON 这样的
{"details":{"map":{"lastname":"b","firstname":"a","password":"c"}},"sometim":"someting"}
我需要知道如何避免 gson 解析器自动添加的 map
键。
编辑:我刚刚发现 gson 在序列化对象内部的数组时也会添加一个 "myArrayList"
。这非常令人沮丧,并且通过 JSON 进行解析变得困难和烦人。
"map":{"fruits":{"myArrayList":["Apples"]}
如果有人想知道如何解决这个问题,我通过执行以下操作找到了解决方案:
public static void something(User user) throws Exception {
try {
ObjectWriter ow = new ObjectMapper().writer();
String json = ow.writeValueAsString(user);
Nesting testing = new Nesting(null, "someting");
Object object = gson.fromJson(json, Object.class);
testing.setDetails(object);
JsonElement something = gson.toJsonTree(testing);
System.out.println(something);
} catch (Exception e) {
throw e;
}
}
用户 GsonBuilder 创建 Gson。注册自定义 TypeAdapter
new GsonBuilder()
.registerTypeAdapter(JSONObject.class, JSONObjectAdapter.sInstance)
.registerTypeAdapter(JSONArray.class, JSONArrayAdapter.sInstance)
JSONObjectAdapter.jva
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);
}
}
}
JSONArrayAdapter.java
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);
}
}
}
尝试使用 com.google.gson.JsonObject
而不是 JSONObject
。请参阅 this。
在我的代码中,我需要将 org.json.JSONObject
添加到另一个使用 gson.toJson
序列化的对象。然而,当这个对象被序列化时,JSONObject
中的值被 gson 自己嵌套到一个映射键中。例如,
public class New {
private static final Gson gson = new GsonBuilder().disableHtmlEscaping().create();
public static void something(User user) throws Exception {
try {
ObjectWriter ow = new ObjectMapper().writer();
String json = ow.writeValueAsString(user);
JSONObject maskedUser = new JSONObject(json);
Nesting testing = new Nesting(maskedUser, "someting");
String something = gson.toJson(testing);
System.out.println(something);
} catch (Exception e) {
throw e;
}
}
public static void main(String[] args) throws Exception {
User user = new User("a", "b", "c");
something(user);
}
}
我收到输出 JSON 这样的
{"details":{"map":{"lastname":"b","firstname":"a","password":"c"}},"sometim":"someting"}
我需要知道如何避免 gson 解析器自动添加的 map
键。
编辑:我刚刚发现 gson 在序列化对象内部的数组时也会添加一个 "myArrayList"
。这非常令人沮丧,并且通过 JSON 进行解析变得困难和烦人。
"map":{"fruits":{"myArrayList":["Apples"]}
如果有人想知道如何解决这个问题,我通过执行以下操作找到了解决方案:
public static void something(User user) throws Exception {
try {
ObjectWriter ow = new ObjectMapper().writer();
String json = ow.writeValueAsString(user);
Nesting testing = new Nesting(null, "someting");
Object object = gson.fromJson(json, Object.class);
testing.setDetails(object);
JsonElement something = gson.toJsonTree(testing);
System.out.println(something);
} catch (Exception e) {
throw e;
}
}
用户 GsonBuilder 创建 Gson。注册自定义 TypeAdapter
new GsonBuilder()
.registerTypeAdapter(JSONObject.class, JSONObjectAdapter.sInstance)
.registerTypeAdapter(JSONArray.class, JSONArrayAdapter.sInstance)
JSONObjectAdapter.jva
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);
}
}
}
JSONArrayAdapter.java
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);
}
}
}
尝试使用 com.google.gson.JsonObject
而不是 JSONObject
。请参阅 this。