我正在尝试将以下 JSON
反序列化为 java 对象。
"distance":[
{
"weight": 60,
"unit": "km"
},
{
"weight": 100,
"unit": "m"
}
]
java 对象应该如下所示:
[
{
"km": 60
},
{
"m": 100
}
]
最佳答案
这里我发现了两个问题,一是它的JSON格式不正确。应该是:
{
"distance":[
{
"weight": 60,
"unit": "km"
},
{
"weight": 100,
"unit": "m"
}
]
}
或者
[
{
"weight": 60,
"unit": "km"
},
{
"weight": 100,
"unit": "m"
}
]
另一个是,你没有明确提到你的POJO。您可以通过多种方式实现此响应。为了简单起见,我假设简单 Map
为了它。
但是,我们首先需要使该字符串格式正确。
String jsonStr = "\"distance\":[\n" +
" {\n" +
" \"weight\": 60,\n" +
" \"unit\": \"km\"\n" +
" },\n" +
" {\n" +
" \"weight\": 100,\n" +
" \"unit\": \"m\"\n" +
" }\n" +
"]";
jsonStr = jsonStr.substring(jsonStr.indexOf(":") + 1);
创建一个类:
@Data
public class Distance {
private Double weight;
private String unit;
}
这里我使用 lombok 作为 getter 和 setter。
将 JSON 字符串解析到 Distance
的列表 :
ObjectMapper objectMapper = new ObjectMapper();
List<Distance> distances = objectMapper.readValue(jsonStr, new TypeReference<List<Distance>>(){});
现在您可以将此列表转换为您想要的响应。用于将此响应转换为 Map
:
Map<String, Double> response = distances.stream().collect(Collectors.toMap(Distance::getUnit, Distance::getWeight));
或者,您可以将其转换为 List<Pair<String, Double>>
还有:
List<Pair<String, Double>> response = new ArrayList<>();
distances.forEach(distance -> {
response.add(new Pair(distance.getUnit(), distance.getWeight()));
});
祝你编码愉快...
关于java - 使用java枚举进行Json反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60737690/