Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化ArrayList并返回,保留类_Java_Json_Jackson - Fatal编程技术网

Java 序列化ArrayList并返回,保留类

Java 序列化ArrayList并返回,保留类,java,json,jackson,Java,Json,Jackson,我正在尝试将不同对象的集合发送到接受Json对象的服务器。找出实现这一点的最佳方法 计划A: 序列化对象集合,如下所示: ArrayList<Object> objects = new ArrayList<>(); objects.put(new Human("Johhny")); objects.put(new Cannon(13)); objects.put(new Hamburger(1.3)); String json = Utils.getObjectMappe

我正在尝试将不同对象的集合发送到接受Json对象的服务器。找出实现这一点的最佳方法

计划A: 序列化对象集合,如下所示:

ArrayList<Object> objects = new ArrayList<>();
objects.put(new Human("Johhny"));
objects.put(new Cannon(13));
objects.put(new Hamburger(1.3));
String json = Utils.getObjectMapper().writeValueAsString(objects);
序列化工作得很好,当我必须反序列化时,我会收到一个对象数组,精确地说,它链接的哈希映射太多。问题是,我不知道这些是人,大炮还是汉堡包

有没有办法将对象的类名放入json中,这样当它被反序列化时,对象映射器就知道要使用哪个类了

方案B: 解析每个LinkedHashMap,根据属性手动确定它的真实类,并手动反序列化为对象

方案C:

将每种类型的对象放入具有特定类型的不同集合中。 序列化三个集合,并使用特定拆分器将它们组合成一个字符串 按相反顺序反序列化回。 解决办法是: 只需在写入字符串之前添加映射器设置:Utils.getObjectMapper.enableDefaultTypingObjectMapper.DefaultTyping.JAVA_LANG_OBJECT.WriteValueAsString对象


感谢@dmitry zvorygin

多态反序列化是您所需要的全部-


只需确保所有实体都有基类。

使用instanceof操作符-检查对象属于哪个类,然后进行强制转换it@rohit-thomas在服务器上反序列化时,instanceof返回LinkedHashMap,这是未知对象的默认值,包含的对象不扩展任何公共类,也不实现任何公共接口。我想我会坚持这个计划B@JackHammer,您是否阅读了ObjectMapper中的非混凝土和数组标志?这才是你真正需要的。根本不需要基类。在RTFM之后,它就像一个符咒一样工作!我刚刚更改了映射器选项:Utils.getObjectMapper.enableDefaultTypingObjectMapper.DefaultTyping.JAVA_LANG_OBJECT.WriteValueAsString对象;