java - 使用java枚举进行Json反序列化

标签 java json spring-boot enums deserialization

我正在尝试将以下 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/

相关文章:

Java反射: avoid fields with default values

json - 世博会中的动态本地镜像?

java - 如何使 MultipartFilter 与 Spring Boot 一起使用

java - 创建类路径资源中定义的名称为 'entityManagerFactory' 的 bean 时出错 - 调用 init 方法失败

java - 应用程序需要 JRE 版本

java - 正常的代码在另一台机器上运行时出现java.lang.NullPointerException

php - 使用 CURL 发送 Twizo 短信

java - spring boot 数据库错误数据源 "org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration”

java - 使用 Spring Web Flow 绑定(bind)模型以查看

java - 从字符串创建对象并在同步块(synchronized block)中用作监视器