【问题标题】:Serializing nested org.json.JSONObject using gson.toJson adding into "map" key使用 gson.toJson 序列化嵌套的 org.json.JSONObject 添加到“map”键中
【发布时间】:2018-04-27 09:53:02
【问题描述】:

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

【问题讨论】:

    标签: java json gson fasterxml


    【解决方案1】:

    用户 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

    【讨论】:

      【解决方案2】:

      尝试使用com.google.gson.JsonObject 而不是JSONObject。请参阅this

      【讨论】:

        【解决方案3】:

        如果有人想知道如何解决这个问题,我通过执行以下操作找到了解决方案:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-17
          • 2022-12-12
          • 2016-10-04
          • 1970-01-01
          • 2021-12-23
          • 2014-09-27
          • 1970-01-01
          相关资源
          最近更新 更多