繁体   English   中英

从地图获取字段类型

[英]Getting field types from Map

我在jsonString字段中有一个json字符串,并且我正在使用ObjectMapper。

String jsonString = {"age":12,"location":"UK","gender":"male"};

ObjectMapper mapper = new ObjectMapper();
Map map = mapper.readValue(jsonString, Map.class);

有没有一种方法可以从Map检索字段类型,而不是使用Pojo类。 例如,年龄是整数类型,性别是字符串类型,这不涉及使用Pojo类而是使用Map类? 谢谢

是的,只需调用即可(映射器来自com.fasterxml.jackson.databind.ObjectMapper)

String age = (String) map.get("age"); 

你可以这样做。 但是您需要将类型从Object转换为有效类型。

    String jsonString = "{\"age\":12,\"location\":\"UK\",\"gender\":\"male\"}";

    ObjectMapper mapper = new ObjectMapper();
    try {
        Map map = mapper.readValue(jsonString, Map.class);
        System.out.println(map);
        Integer age = (int)map.get("age");
        System.out.println(age);
        System.out.println(map.get("age").getClass());
    }catch (IOException|NullPointerException e){}

您可以使用getClass()方法获取类型。

System.out.println(map.get("age").getClass());

JSON是一种无类型的语言。 因此,您这里确实有两种情况:

情况1 :您知道这些字段具有的类型,并且希望以安全的方式与值进行交互。

在这种情况下,您需要将强制类型转换硬编码为您知道应该存在的类型,或者您应该创建一个POJO类进行反序列化。 (如果仅在较小范围内使用mapper.readValue() ,则可以在使用它的函数内使用私有类,甚至可以使用本地类。)无论如何,如果mapper.readValue()或您的代码将抛出异常,数据不匹配。 您将需要捕获此异常或传播给您的呼叫者。 究竟哪种故障有意义,实际上取决于您的应用程序,但是有很多可能的故障。

情况2 :您不知道这些字段应该具有哪种类型,并且想发现要与之交互的值的类型。

不幸的是,没有静态可验证的方式与在运行时才未知的类型进行交互。 (这基本上是静态类型系统与动态类型系统之间区别的定义。)实际上,使用从JSON反序列化的数据,所有内容都将是NumberStringList<?>Map<?, ?>null 因此,您将需要处理这些情况,但是即使在List ,也无法在没有遍历和检查每个元素的情况下就无法知道每个元素的类型-并且可能唯一的Java类型能够用来表示列表的是List<?> (也就是说,可能没有通配符可以解析为的有效类型,例如在异构列表的情况下)。

就是说,需要分析真正动态的数据结构是相对罕见的。 通常,任何JSON数据的确具有标准化的结构,因此正确的解决方案是构建一个表示该结构的数据对象(作为Java POJO类),然后将传入的数据转换为对象。 如果数据无法在您的对象中表示,则意味着传入的数据不是您的程序准备处理的内容。 在大多数情况下,您应该立即因错误中止,而不是试图弄乱您不理解的数据(这是“快速失败”的原则)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM