Java中如何将JSON里可同时为String或Array的字段转为逗号分隔字符串
解决Jackson反序列化同时支持字符串和字符串数组类型字段的方案
方案1:使用自定义Jackson反序列化器(推荐)
你可以通过自定义反序列化器实现自动判断字段类型,按规则转换为目标字符串格式,步骤如下:
- 编写自定义反序列化器类
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class StringOrArrayToStringDeserializer extends JsonDeserializer<String> { @Override public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { JsonToken currentToken = jsonParser.getCurrentToken(); // 处理字符串类型的输入 if (currentToken == JsonToken.VALUE_STRING) { return jsonParser.getText(); } // 处理数组类型的输入 if (currentToken == JsonToken.START_ARRAY) { List<String> logsList = new ArrayList<>(); currentToken = jsonParser.nextToken(); while (currentToken != JsonToken.END_ARRAY) { if (currentToken == JsonToken.VALUE_STRING) { logsList.add(jsonParser.getText()); } currentToken = jsonParser.nextToken(); } // 拼接为逗号分隔的字符串,可根据业务需求调整分隔符 return String.join(",", logsList); } // 其他异常类型按业务规则返回默认值即可 return ""; } }
- 给实体类的对应字段绑定反序列化器
@JsonProperty("logs") @JsonDeserialize(using = StringOrArrayToStringDeserializer.class) private String logs;
方案2:临时兼容方案(不推荐)
如果不想新增反序列化器类,也可以调整字段类型为Object,在业务代码中手动做类型判断转换:
@JsonProperty("logs") private Object logs; // 业务代码中调用该方法获取格式化后的字符串 public String getFormattedLogs() { if (logs instanceof String) { return (String) logs; } else if (logs instanceof List) { return String.join(",", (List<String>) logs); } return ""; }
该方案缺点是需要在所有使用该字段的场景手动做类型转换,容易遗漏导致类型转换异常。
内容的提问来源于stack exchange,提问作者Veer7
相关产品推荐
相关产品推荐

