我正在尝试序列化单个JSON对象的列表,该列表由逗号分隔为使用Jackson的Java中的某种集合。
由于JSON的表示方式,只有使用自定义映射器才能做到这一点,这样的想法正确吗?
JSON输入:
{"_1":"186","_3":"In Stock"},{"_1":"187","_3":"In Stock"},{"_1":"188","_3":"In Stock"},{"_1":"189","_3":"In Stock"}POJO
public class StockInfo {
private String _1;
private String _3;
@JsonProperty("_1")
public String get_1() {
return _1;
}
@JsonProperty("_1")
public void set_1(String _1) {
this._1 = _1;
}
@JsonProperty("_3")
public String get_3() {
return _3;
}
@JsonProperty("_3")
public void set_3(String _3) {
this._3 = _3;
}
}序列化
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
List<StockInfo> stockList = objectMapper.readValue(resultInputStream, new TypeReference<List<StockInfo>>(){});发布于 2020-12-05 22:04:55
Jackson无法解析它,因为它根本不是有效的JSON格式,除非JSON对象在JSON数组中:
[{"_1":"186","_3":"In Stock"},{"_1":"187","_3":"In Stock"},{"_1":"188","_3":"In Stock"},{"_1":"189","_3":"In Stock"}]如果您无法控制获取数据的格式,则可以将伪JSON字符串封装在方括号中,使其成为JSON数组:
// Wrap the pseudo-JSON string in square brackets, making it a JSON array
String jsonArray = "[" + pseudoJson + "]";
// Parse like you intended
List<StockInfo> stockList = objectMapper.readValue(jsonArray, new TypeReference<>() {});或者,您可以拆分字符串,然后尝试单独解析每个对象:
// Split the pseudo-JSON string at commas preceded by a closing curly bracket
String[] jsonObjects = pseudoJson.split("(?<=}),");
// Parse each JSON object to a StockInfo instance and add it to a List
List<StockInfo> stockList = new ArrayList<>();
for(String jsonObject : jsonObjects) {
StockInfo stockInfo = objectMapper.readValue(jsonObject, new TypeReference<>() {});
stockList.add(stockInfo);
}杰克逊提供的最接近的东西是DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,但在您的例子中,您只会得到第一个元素。
https://stackoverflow.com/questions/65156984
复制相似问题