gpt4 book ai didi

java - 为 json 字符串创建通用 java 映射器

转载 作者:行者123 更新时间:2023-11-30 02:10:45 28 4
gpt4 key购买 nike

我正在开发一个 Spring-boot 项目,我收到了不同格式的 Json 字符串。我的目标是将这些 Json 字符串转换为统一的 Java 类。

我可以收到此 Json 的许多变体:

{ "id" : "someId", "type" : "temperature", "value" : 21.0 }

例如,一种变体可能如下所示:

{ "id" : "someId", "data" : { "type": "temp", "val" : 21.0 }, "location": "here" }

所以这2个Json必须映射到同一个Java类中。我已经想到了 2 个解决方案:

第一个解决方案

1)为我可能收到的每个 Json 创建一个特定的 Java 类

2) 创建一个接受该特定对象并返回统一 Java 类的函数

第二种解决方案

1) 使用 Json 字符串创建 JsonNode

2) 对于每个键,尝试将其与统一 Java 类的字段相匹配。但我们必须考虑节点的每个可能的键,例如“value”或“val”。

解决这个问题的最佳方法是什么?我正在寻找一种易于维护的解决方案。

编辑:我已经在使用 Jackson,但我的问题是将这个 Json 对象映射到独立于 Json 的通用 Java 类

编辑2:统一Java类是一个已经存在的类模型,它用于在我们的数据库中存储信息。因此,为了将信息推送到我们的数据库中,我必须将收到的每个 json 转换为这种统一格式

最佳答案

我可以看到以下解决方案。例如。你使用Jackson用于解析JSON你可以声明你自定义ObjectMapper :

ObjectMapper mapper = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

此映射器包含忽略未知属性的附加选项。

  1. 你吗Map<String, Object>作为目的地舱位。这是magic key而且它总是有效。 Contra:您没有 json 验证,并且必须添加许多常量键才能读取此内容。

示例:

public static <T> Map<String, T> readMap(String json) throws NGPException {
if (json == null) {
return null;
}

ObjectReader reader = JSON_MAPPER.readerFor(Map.class);
MappingIterator<Map<String, T>> it = reader.readValues(json);

if (it.hasNextValue()) {
Map<String, T> res = it.next();
return res.isEmpty() ? Collections.emptyMap() : res;
}

return Collections.emptyMap();
}

客户:

Map<String, Object> map = readMap("json string");
String id = (String)map.getOrDefault("id", null);
  1. 第二种方法是构建包含所有可能变量的一个通用类。此外,您必须将选项设置为 jackson 忽略未知字段。在这种情况下, jackson 将使用现有字段。

示例:

public static <T> T read(String json, Class<T> clazz) throws NGPException {
return mapper.readerFor(clazz).readValue(json);
}

class Response {
private String id;
private String type;
private Double value;
private String location;
private Data data;

public class Data {
private String type;
private String temp;
private Double value;
}
}

客户:

Response response = read("json string", Response.class);

关于java - 为 json 字符串创建通用 java 映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50163451/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com