我想通过将 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/