有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

例如,一个变体可能看起来像:

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

因此,这两个Json必须映射到同一个Java类中。 我已经想到了两种解决方案:

第一个解决方案

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

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

第二种解决方案

1)使用Json字符串创建JsonNode

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

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    我通常使用谷歌的GSon。这真的很有用。查一下格森。在您的案例中使用fromJson(yourJsonString)

    你可以很容易地使用

    Gson gson = new Gson();    
    Data data = gson.fromJson(jsonString, Data.class);
    
  2. # 2 楼答案

    我可以看到以下解决方案。例如,您使用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将使用现有字段

    示例:

    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);