java - 使用 gson.toJson 序列化嵌套的 org.json.JSONObject 添加到 "map"键

标签 java json gson fasterxml

在我的代码中,我需要将 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"]}

最佳答案

用户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);
        }
    }
}

look this answer, add custom TypeAdapter

关于java - 使用 gson.toJson 序列化嵌套的 org.json.JSONObject 添加到 "map"键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50059808/

相关文章:

java - 有没有一种方法可以通过忽略 DocReader 字段在 Java 中搜索来获取所有文档

java - 重定向到新 URL 时小程序崩溃

java - java中如何将数据库结果集转换为JSON格式?

java - 将我的 writeJsonFile 函数从 GSON 更改为 Jackson

android - 使用GSON反序列化嵌套数组

java - 如何使用 Mockito 通过私有(private)方法调用测试 void 方法

javascript - 将源 JSON 字符串合并到具有相似键但在 javascript 中具有不同结构的目标

java - 将 JSON 映射到简单的 Java 子类

java - 如何迭代由 GSON 生成的 JAVA 对象列表

java - Drools:调用 addPackageFromDrl(source) 时出现 NullPointerException