java - 将对象修改合并到 java 对象 (JSON)

标签 java json gson

我想通过将 json 字符串传递给我的应用程序来修改 java 对象。 String 将包含有关完整的、已修改对象的所有信息,而仅包含要设置的单个成员。

class SomeClass {

    Object var1 = "Hello";
    Object var2 = "AAA";

    // A lot of fields goes here ...

}

public AppTest() throws Exception {

    SomeClass myObject = new SomeClass();
    myObject.var2 = "BBB";

    String modification = "{\"var1\":\"Goodbye\"}";

    Gson gson = new Gson();
    SomeClass modifed = gson.fromJson(modification, SomeClass.class);

    // TODO: Merge a modifed object into myObject somehow

}

此外,一些字段可能是具有任意数量字段的对象。同样,我可能只想修改子对象中的单个基元。一个更复杂的例子:

class SomeOtherClass {

    String var4 = "444";
    String var5 = "555";

}

class SomeClass {

    Object var1 = "111";
    Object var2 = "222";
    SomeOtherClass var3 = new SomeOtherClass();

}

public AppTest() throws Exception {

    SomeClass myObject = new SomeClass();
    myObject.var2 = "AAA";
    myObject.var3.var5 = "BBB";

    String modification = "{\"var3\":{\"var5\":\"XXX\"}}";

    Gson gson = new Gson();
    SomeClass modifed = gson.fromJson(modification, SomeClass.class);

    // TODO: Merge the modifed object into myObject somehow

}

那么,我的问题是如何使用 JSON 部分修改对象?

最佳答案

您好,我尝试了一个伪示例,如下所示:

static Object merge(Object target, Object modified) {

        for (Field f : target.getClass().getDeclaredFields()) {
            if (!f.isAccessible()) {
                f.setAccessible(true);
            }
            if (f.getType().isPrimitive()) {

                    try {
                        if (f.getType().isAssignableFrom(java.lang.Boolean.TYPE)
                                && f.getBoolean(modified) != f.getBoolean(target)) {
                            f.setBoolean(target, f.getBoolean(modified));
                        } else if (f.getType().isAssignableFrom(java.lang.Character.TYPE)
                                && f.getChar(modified) != f.getChar(target)) {
                            f.setChar(target, f.getChar(modified));
                        } else if (f.getType().isAssignableFrom(java.lang.Integer.TYPE)
                                && f.getInt(modified) != f.getInt(target)) {
                            f.setInt(target, f.getInt(modified));
                        }
                        //....
                        // do it for all other primitive types
                       //also consider Enum types(not primitive so check 'f.getType().isEnum()') 
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }


            } else if (f.getType().getPackage().getName().matches("java.lang.*")
                    || f.getType().getPackage().getName().matches("java.util.*")) {
                /* Here I am trying to directly assign changes for the basic packages, if you want more you can add more packages*/

                try {
                    if (f.get(modified) != null && f.get(target) != f.get(modified)) {
                        f.set(target, f.get(modified));
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            } else {
                /* If local classes encountered as member variables then do the same merge!*/
                try {
                    merge(f.get(target), f.get(modified));
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }

        }
        return target;

    }

您可以将此方法称为 myObject = (SomeClass) merge(myObject, modifed);

注意:这不是完成您的工作的全功能方法,您请阅读内联评论并使其成为您的案例的完美选择。我只保证基本功能

关于java - 将对象修改合并到 java 对象 (JSON),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33475100/

相关文章:

android - 如何使用 GSON 解析 JSON 响应(不同对象类型)

java - 同时显示字符和整数

java - 什么是比较 StringBuilder 对象的有效方法

java - Jackson 多态反序列化(类依赖于 JSON 键)

javascript - 从多个文件加载多个 JSON 对象

mysql - Spring data JPA中将java bean的List<Long>转换为mysql的json

java - 在android中如何访问从Api返回的Gson对象而不返回空指针异常?

java - 在 Java 中使用数组

java - Java中遍历二叉搜索树时出现StackOverflowError

java - 根据 FieldNamingPolicy 重命名 GSON 中的映射键