我在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类?谢谢
答案 0 :(得分:0)
是的,只需调用即可(映射器来自com.fasterxml.jackson.databind.ObjectMapper)
String age = (String) map.get("age");
答案 1 :(得分:0)
您可以执行此操作。但是您需要将类型从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());
答案 2 :(得分:0)
JSON是一种非类型化语言。所以您这里确实有两种情况:
情况1 :您知道这些字段应该具有什么类型,并且希望以安全的方式与值进行交互。
在这种情况下,您需要将强制转换硬编码为您知道应该存在的类型,或者您应该创建一个POJO类以进行反序列化。 (如果仅在较小的范围内使用此类,则可以在使用它的函数中使用私有类,甚至可以使用本地类。)在任何情况下,如果mapper.readValue()
或您的代码将抛出异常,数据不匹配。您将需要捕获此异常或传播给您的呼叫者。究竟哪种故障有意义,这实际上取决于您的应用程序,但是有很多可能的故障。
情况#2 :您不知道这些字段应具有什么类型,并且想发现要与之交互的值的类型。
不幸的是,没有静态可验证的方式与在运行时才未知的类型进行交互。 (这基本上是静态类型系统与动态类型系统之间区别的定义。)实际上,使用从JSON反序列化的数据,所有内容都将是Number
,String
,List<?>
,{{ 1}}或Map<?, ?>
。因此,您将需要处理这些情况,但是即使在null
中,您也无法在没有遍历和检查每个元素的情况下知道每个元素是什么类型-而且有可能唯一的Java您将能够用来表示列表的类型是List
(也就是说,例如对于异类列表,可能没有通配符可以解析为的有效类型)。
也就是说,分析真正动态的数据结构是相对不常见的。通常,任何JSON数据的确具有标准化的结构,因此正确的解决方案是构建一个表示该结构的数据对象(作为Java POJO类),然后将传入的数据转换为对象。如果数据无法在您的对象中表示,则意味着传入的数据不是您的程序准备处理的内容。在大多数情况下,您应该立即中止并出错,而不是试图弄乱您不理解的数据(这是“快速失败”的原则)。