如何将Kafka接收的键值对格式单行字符串映射至Java DTO?
如何将自定义格式字符串映射到Java DTO
当然可以实现这种映射,下面给你几种实用的方案:
方案1:手动字符串解析
这是最直接的方式,不需要额外依赖,适合格式固定的场景:
public class CustomDtoMapper { public static YourDto parseToDto(String input) { YourDto dto = new YourDto(); // 按逗号分割每个键值对 String[] keyValuePairs = input.split(","); for (String pair : keyValuePairs) { // 按冒号分割键和值,同时去除前后空格 String[] parts = pair.split(":"); if (parts.length != 2) { // 处理格式异常,比如抛出自定义异常或跳过无效项 continue; } String key = parts[0].trim(); String value = parts[1].trim(); switch (key) { case "type": dto.setType(value); break; case "code": dto.setCode(value); break; case "time": dto.setTime(Integer.parseInt(value)); break; // 可添加其他字段的处理逻辑 } } return dto; } }
方案2:正则表达式提取
如果格式有轻微变化(比如空格数量不固定),正则表达式会更灵活:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDtoMapper { private static final Pattern PATTERN = Pattern.compile("type:\\s*(\\w+),\\s*code:\\s*(\\w+),\\s*time:\\s*(\\d+)"); public static YourDto parseToDto(String input) { YourDto dto = new YourDto(); Matcher matcher = PATTERN.matcher(input); if (matcher.find()) { dto.setType(matcher.group(1)); dto.setCode(matcher.group(2)); dto.setTime(Integer.parseInt(matcher.group(3))); } else { // 处理匹配失败的情况 throw new IllegalArgumentException("Invalid input format: " + input); } return dto; } }
方案3:自定义Jackson反序列化器
如果你习惯用Jackson的ObjectMapper,可以自定义一个反序列化器来适配这种格式:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import java.io.IOException; public class YourDtoDeserializer extends JsonDeserializer<YourDto> { @Override public YourDto deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String input = p.getText(); // 复用方案1或方案2的解析逻辑 return CustomDtoMapper.parseToDto(input); } }
然后在DTO类上添加注解关联反序列化器:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @JsonDeserialize(using = YourDtoDeserializer.class) public class YourDto { private String type; private String code; private int time; // 构造方法、getter、setter省略 }
之后就可以像处理JSON一样用ObjectMapper解析:
ObjectMapper mapper = new ObjectMapper(); YourDto dto = mapper.readValue(inputString, YourDto.class);
内容的提问来源于stack exchange,提问作者Jsef bch
相关产品推荐
相关产品推荐

