如何将JSON字符串转换为CqlDuration?Jackson反序列化报错解决
解决Jackson反序列化字符串到CqlDuration的问题
可以通过添加Jackson注解结合自定义逻辑解决这个问题,核心是告诉Jackson如何将字符串格式的时长转换为CqlDuration实例,以下是两种可行方案:
方案一:自定义反序列化器 + @JsonDeserialize注解
这种方式灵活性高,适合多个实体类复用同一转换逻辑:
- 编写自定义反序列化器,借助
CqlDuration.fromString()方法完成字符串到对象的转换:
import com.datastax.oss.driver.api.core.data.CqlDuration; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; public class CqlDurationDeserializer extends StdDeserializer<CqlDuration> { public CqlDurationDeserializer() { this(null); } public CqlDurationDeserializer(Class<?> vc) { super(vc); } @Override public CqlDuration deserialize(JsonParser parser, DeserializationContext ctx) throws IOException { return CqlDuration.fromString(parser.getText()); } }
- 在实体类的对应字段上添加
@JsonDeserialize注解,指定使用自定义反序列化器:
public class YourDataEntity { // 其他字段... @JsonDeserialize(using = CqlDurationDeserializer.class) private CqlDuration down_duration; // getter、setter方法... }
方案二:使用@JsonCreator注解标记工厂方法
如果不想编写单独的反序列化器,可以在实体类中添加带@JsonCreator注解的静态工厂方法,直接处理JSON字段的转换:
import com.datastax.oss.driver.api.core.data.CqlDuration; import com.fasterxml.jackson.annotation.JsonCreator; import java.util.Map; public class YourDataEntity { private CqlDuration down_duration; // 其他字段... @JsonCreator public static YourDataEntity createFromJson(Map<String, Object> jsonMap) { YourDataEntity entity = new YourDataEntity(); String durationStr = (String) jsonMap.get("down_duration"); entity.setDown_duration(CqlDuration.fromString(durationStr)); // 初始化其他字段... return entity; } // getter、setter方法... }
注意事项
- 确保项目已正确引入Cassandra Java Driver依赖,
CqlDuration.fromString()支持解析"1h"、"30m"、"2d"这类符合ISO 8601标准的时长字符串。 - 如果需要将
CqlDuration序列化为字符串返回,可参照上述逻辑编写自定义序列化器,配合@JsonSerialize注解使用。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

