code: public byte[] getRawSubcomponent(String key) throws IOException {
      JsonParser p = this.getParser();
      JsonToken t = p.nextToken();
  
      while (t != null) {
        if (t == JsonToken.FIELD_NAME && p.getCurrentName().equals(key)) {
          t = p.nextToken();
          if (t == JsonToken.START_OBJECT) {
            JsonGenerator g = this.getGenerator();
            g.copyCurrentStructure(p);
            g.flush();
            byte[] subcomponent = ((ByteArrayOutputStream) g
                .getOutputTarget()).toByteArray();
            g.close();
            p.close();
            return subcomponent;
          } else {
            log.error("Key {} does not start an object.", key);
            return AceFunctions.getBlankComponent();
          }
        }
        t = p.nextToken();
      }
      //        log.debug("Did not find key: {} in {}", key, new String(this.component, "UTF-8"));
      return AceFunctions.getBlankComponent();
    }
docs: Return the {@code byte[]} JSON object for the key in this component.
  
  Like {@link #getValueOr} for subcomponents. This will grab the JSON
  object for a subcomponent (for example: {@code initial_condition} for
  {@link AceExperiment}). If the key is not found or is not a JSON object,
  a blank subcomponent is returned.
  
  @param key key for a JSON object in this component.
  @return {@code byte[]} for the JSON object or {@code {}}
  @throws IOException if there is an I/O error