code: func (h *Hook) ParseJSONParameters(headers, query, payload *map[string]interface{}) []error {
  	var errors = make([]error, 0)
  
  	for i := range h.JSONStringParameters {
  		if arg, ok := h.JSONStringParameters[i].Get(headers, query, payload); ok {
  			var newArg map[string]interface{}
  
  			decoder := json.NewDecoder(strings.NewReader(string(arg)))
  			decoder.UseNumber()
  
  			err := decoder.Decode(&newArg)
  
  			if err != nil {
  				errors = append(errors, &ParseError{err})
  				continue
  			}
  
  			var source *map[string]interface{}
  
  			switch h.JSONStringParameters[i].Source {
  			case SourceHeader:
  				source = headers
  			case SourcePayload:
  				source = payload
  			case SourceQuery, SourceQueryAlias:
  				source = query
  			}
  
  			if source != nil {
  				key := h.JSONStringParameters[i].Name
  
  				if h.JSONStringParameters[i].Source == SourceHeader {
  					key = textproto.CanonicalMIMEHeaderKey(h.JSONStringParameters[i].Name)
  				}
  
  				ReplaceParameter(key, source, newArg)
  			} else {
  				errors = append(errors, &SourceError{h.JSONStringParameters[i]})
  			}
  		} else {
  			errors = append(errors, &ArgumentError{h.JSONStringParameters[i]})
  		}
  	}
  
  	if len(errors) > 0 {
  		return errors
  	}
  
  	return nil
  }
docs: // ParseJSONParameters decodes specified arguments to JSON objects and replaces the
  // string with the newly created object