agent/utils/json.go
func CompleteJsonUnmarshal(b []byte, iface interface{}) error {
	keys, err := JsonKeys(b)
	if err != nil {
		return err
	}

	structType := reflect.ValueOf(iface).Type()

	for _, key := range keys {
		_, found := structType.FieldByNameFunc(func(name string) bool {
			structField, _ := structType.FieldByName(name)
			jsonTag := structField.Tag.Get("json")
			jsonName := strings.Split(jsonTag, ",")[0]
			if jsonName == key {
				return true
			}
			if strings.EqualFold(key, structField.Name) {
				return true
			}
			return false
		})
		if !found {
			// We encountered a json key that there was no corresponding struct
			// field for; this is not complete
			return errors.New("Unrecognized key: " + key)
		}
	}
	return nil
}
func CompleteJsonUnmarshal(b []byte, iface interface{}) error {
	keys, err := JsonKeys(b)
	if err != nil {
		return err
	}

	structType := reflect.ValueOf(iface).Type()

	for _, key := range keys {
		_, found := structType.FieldByNameFunc(func(name string) bool {
			structField, _ := structType.FieldByName(name)
			jsonTag := structField.Tag.Get("json")
			jsonName := strings.Split(jsonTag, ",")[0]
			if jsonName == key {
				return true
			}
			if strings.EqualFold(key, structField.Name) {
				return true
			}
			return false
		})
		if !found {
			// We encountered a json key that there was no corresponding struct
			// field for; this is not complete
			return errors.New("Unrecognized key: " + key)
		}
	}
	return nil
}
// CompleteJsonUnmarshal determines if a given struct has members corresponding
// to every key of a json object (passed as the json string).
// By default, Go ignores fields in an object which have no corresponding struct
// member and this can be used to determine if this ignoring has occurred
// Errors will result in "false" as a return value