[SalesForce] How to dynamically create JSON from many dot-separated strings (for example project.owner.name)

I have many strings in the custom setting with and without dot-separated field names. For example:

  1. id
  2. name
  3. owner.name
  4. owner.id
  5. project.key
  6. project.owner.name
  7. project.owner.id
  8. document.owner.parentPerson.name

I want to dynamically create JSON string with all these fields. My expected result is:

{  
    "id":"some value",
    "name":"some value",
    "owner":{  
        "name":"some value",
        "id":"some value"
    },
    "project":{  
        "key":"some value",
        "owner":{  
            "name":"some value",
            "id":"some value"
        }
    },
    "document":{
        "owner":{
            "parentPerson":{
                "name":"some value"
            }
        }    
    }
}

How can I do this? Thanks!

Best Answer

This (cursorily tested) code is the sort of thing I would write:

String[] names = new String[]{'k', 'k0.k1'};
String[] values = new String[]{'v', 'vv'};

Map<String, Object> root = new Map<String, Object>();
for (Integer j = 0; j < names.size(); j++) {
    String name = names[j];
    String value = values[j];
    Map<String, Object> m = root;
    String[] parts = name.split('\\.');
    for (Integer i = 0; i < parts.size(); i++) {
        String part = parts[i];
        if (i == parts.size() - 1) {
            // At last part so put value
            m.put(part, value);
        } else {
            // Before last part so put map
            Map<String, Object> mm = (Map<String, Object>) m.get(part);
            if (mm == null) {
                mm = new Map<String, Object>();
                m.put(part, mm);
            }
            m = mm;
        }
    }
}
String jsonString = JSON.serializePretty(root);
System.debug(jsonString);
Related Topic