是否可以将单个 JSON 对象的逗号分隔列表序列化为 Java 中的集合?
Is it possible to serialise a comma delimited list of single JSON objects to a collection in Java?
我正在尝试序列化单个 JSON 对象的列表,用逗号分隔到 Java 中使用 Jackson 的某种集合。
由于 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>>(){});
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);
}
Jackson 提供的最接近的东西是 DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
,但在你的情况下你只会得到第一个元素。
我正在尝试序列化单个 JSON 对象的列表,用逗号分隔到 Java 中使用 Jackson 的某种集合。
由于 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>>(){});
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);
}
Jackson 提供的最接近的东西是 DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
,但在你的情况下你只会得到第一个元素。