class JsonJobParametersConverter extends DefaultJobParametersConverter {

	private final ObjectMapper objectMapper;

	/**
	 * Create a new {@link JsonJobParametersConverter} with a default
	 * {@link ObjectMapper}.
	 */
	public JsonJobParametersConverter() {
		this(new ObjectMapper());
	}

	/**
	 * Create a new {@link JsonJobParametersConverter} with a custom {@link ObjectMapper}.
	 * @param objectMapper the object mapper to use
	 */
	public JsonJobParametersConverter(ObjectMapper objectMapper) {
		this.objectMapper = objectMapper;
	}

	@Override
	protected String encode(JobParameter<?> jobParameter) {
		Class<?> parameterType = jobParameter.getType();
		Object parameterTypedValue = jobParameter.getValue();
		boolean parameterIdentifying = jobParameter.isIdentifying();
		String parameterStringValue = this.conversionService.convert(parameterTypedValue, String.class);
		try {
			return this.objectMapper.writeValueAsString(new JobParameterDefinition(parameterStringValue,
					parameterType.getName(), Boolean.toString(parameterIdentifying)));
		}
		catch (JsonProcessingException e) {
			throw new JobParametersConversionException("Unable to encode job parameter " + jobParameter, e);
		}
	}

	@SuppressWarnings(value = { "unchecked", "rawtypes" })
	@Override
	protected JobParameter decode(String encodedJobParameter) {<FILL_FUNCTION_BODY>}

	public record JobParameterDefinition(String value, String type, String identifying) {
	}

}

		try {
			JobParameterDefinition jobParameterDefinition = this.objectMapper.readValue(encodedJobParameter,
					JobParameterDefinition.class);
			Class<?> parameterType = String.class;
			if (jobParameterDefinition.type() != null) {
				parameterType = Class.forName(jobParameterDefinition.type());
			}
			boolean parameterIdentifying = true;
			if (jobParameterDefinition.identifying() != null && !jobParameterDefinition.identifying().isEmpty()) {
				parameterIdentifying = Boolean.parseBoolean(jobParameterDefinition.identifying());
			}
			Object parameterTypedValue = this.conversionService.convert(jobParameterDefinition.value(), parameterType);
			return new JobParameter(parameterTypedValue, parameterType, parameterIdentifying);
		}
		catch (JsonProcessingException | ClassNotFoundException e) {
			throw new JobParametersConversionException("Unable to decode job parameter " + encodedJobParameter, e);
		}
	
<methods>public void <init>() ,public org.springframework.batch.core.JobParameters getJobParameters(java.util.Properties) ,public java.util.Properties getProperties(org.springframework.batch.core.JobParameters) ,public void setConversionService(org.springframework.core.convert.support.ConfigurableConversionService) <variables>protected org.springframework.core.convert.support.ConfigurableConversionService conversionService