code: public BaseJsonBo setSubAttr(String attrName, String dPath, Object value) {
          if (value == null) {
              return removeSubAttr(attrName, dPath);
          }
          Lock lock = lockForWrite();
          try {
              JsonNode attr = cacheJsonObjs.get(attrName);
              if (attr == null) {
                  // initialize the first chunk
                  String[] paths = DPathUtils.splitDpath(dPath);
                  if (paths[0].matches("^\\[(.*?)\\]$")) {
                      setAttribute(attrName, "[]");
                  } else {
                      setAttribute(attrName, "{}");
                  }
                  attr = cacheJsonObjs.get(attrName);
              }
              JacksonUtils.setValue(attr, dPath, value, true);
              return (BaseJsonBo) setAttribute(attrName, SerializationUtils.toJsonString(attr),
                      false);
          } finally {
              lock.unlock();
          }
      }
docs: Set a sub-attribute.
  
  @param attrName
  @param value
  @return