1

Suppose, we have a User JSON response:

{
    "name": "Jack",
    "age": 28,
    "address": "Some address",
    "occupation": "Employee",
    "gender":"male"
}

With some network calls, we got another JSON response:

{ "age":"27", "address":"Some new address" }

Now, the requirement is to update the existing object with the updated fields. For e.g:

{
    "name": "Jack",
    "age":"27",
    "address":"Some new address",
    "occupation": "Employee",
    "gender":"male"
}

Notice that age and address was changed. This can be done by making null checks for small user object but doesn't look smart enough for some object like Product that will have more than 100 fields.

Looking for an efficient way to do it in Java/Kotlin.

Michał Ziober
  • 37,175
  • 18
  • 99
  • 146
codepeaker
  • 420
  • 8
  • 15

2 Answers2

1

You can use a HashMap for it, let the value name be a key, and the value will be a value ))) :

HashMap<String, String> hashMap = new HashMap<String, String>(); 


    hashMap.put("name", "Jack"); 
    hashMap.put( "age", "27");

Now, if you need to update values, just add it with the same key:

 hashMap.put( "age", "67");

Now you just need to iterate through your hashMap and get all values back, it could be like this:

 Iterator it = hashMap.entrySet().iterator();
 while (it.hasNext()) {
    Map.Entry pair = (Map.Entry)it.next();
    System.out.println(pair.getKey() + " = " + pair.getValue());
    it.remove();
 } 

And no dataBase, as you can see )))

1

A JSONObject is essentially just a map of keys/values. Assuming you only care about one level deep, a trivial approach here would be to just map the key/values from the second object (where the values are not null) to the current object.

This could be defined as an extension function on JSONObject, such as:

fun JSONObject.mergeWith(other: JSONObject): JSONObject = apply {
    other.keys()
        .asSequence()
        .associateWith(other::get)
        .filterValues { it != null }
        .forEach { (key, value) -> this.put(key, value) }
}

For example:

val firstJson = JSONObject().apply {
    put("x", 1)
    put("y", "1")
}

val secondJson = JSONObject().apply {
    put("x", 2)
    put("y", null)
}

val mergedJson = firstJson.mergeWith(secondJson) // contains x = 2, y = "1"
Kevin Coppock
  • 133,643
  • 45
  • 263
  • 274