JSONObject clone = new JSONObject(base, JSONObject.getNames(base));
// Walk parameter list for the merged object and merge recursively.
String[] fields = JSONObject.getNames(merge);
for (String field : fields) {
Object existing = clone.opt(field);
Object update = merge.get(field);
if (JSONObject.NULL.equals(existing) || JSONObject.NULL.equals(update)) {
// It's new custom config, not referenced in the prototype, or
// it's removing a pre-configured value.
clone.put(field, update);