docs: public static JSONObject merge(JSONObject src, JSONObject dest, String name,
                                     final boolean overwrite) {
          Log.d(Log.SUBSYSTEM.JSON, TAG, "merge(%s), object: src: %s, dest: %s", name, src, dest);
          final Iterator<String> keys = src.keys();
          while (keys.hasNext()) {
              final String key = keys.next();
              final Object value = src.opt(key);
              if (!dest.has(key)) {
                  Log.d(Log.SUBSYSTEM.JSON, TAG, "merge(%s), object: no field '%s' in dest; putting %s", name, key, value);
                  safePut(dest, key, value);
              } else if (value instanceof JSONObject) {
                  Log.d(Log.SUBSYSTEM.JSON, TAG, "merge(%s), object: object value for '%s', submerging %s", name, key, value);
                  mergeSubObject(dest, key, (JSONObject) value, name, overwrite);
              } else if (value instanceof JSONArray) {
                  Log.d(Log.SUBSYSTEM.JSON, TAG, "merge(%s), object: array value for '%s', submerging %s", name, key, value);
                  mergeSubArray(dest, key, (JSONArray) value, name, overwrite);
              } else if (overwrite) {
                  safePut(dest, key, value);
              }
          }
          Log.d(Log.SUBSYSTEM.JSON, TAG, "merge(%s), object: result: %s", name, dest);
          return dest;
      }