Tag: deserialization

使用键作为值反序列化Jackson

我有一个类似于这样的JSON结构: “teams”: { “team1Id”: “team1Name”, “team2Id”: “team2Name” } 我想将它反序列化为这些Java类: class Teams { Team team1; Team team2; } class Team { String id; String name; } 正如您所见,team1Id和team2Id(它们是JSON密钥)应该转换为Java字段的值。 此外,第一个teamId / teamName对应该归因于存储在team1中的对象,而第二个对应存储在team2字段中。 是否有任何本地JACKSON映射器可以执行此操作,还是需要为此创建自己的自定义反序列化器?

在JAXB中需要一个元素或另一个元素

我有一个这样的JAXB注释POJO: @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Clazz implements Serializable { @XmlElement(required = false) private int a; @XmlElement(required = false) private int b; } 我想标记要求字段a或字段b 。 根据我目前的设置,它们都不是必需的,但我希望其中一个存在而不是另一个。 我怎么能实现它?

如何使用Jackson的本地化小数分隔符反序列化浮点值

我用Jackson解析的输入流包含纬度和经度值,例如: { “name”: “product 23”, “latitude”: “52,48264”, “longitude”: “13,31822” } 由于某种原因,服务器使用逗号作为小数分隔符,产生InvalidFormatException 。 由于我无法更改服务器输出格式,因此我想教jackson的ObjectMapper来处理这些情况。 这是相关的代码: public static Object getProducts(final String inputStream) { ObjectMapper objectMapper = new ObjectMapper(); try { return objectMapper.readValue(inputStream, new TypeReference() {} ); } catch (UnrecognizedPropertyException e) { e.printStackTrace(); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (JsonParseException […]

使用GSON获取JSON密钥名称

我有一个JSON数组,其中包含如下对象: { “bjones”: { “fname”: “Betty”, “lname”: “Jones”, “password”: “ababab”, “level”: “manager” } } 我的User类有一个用户名,需要使用JSON对象的密钥。 我如何获得JSON对象的密钥? 我现在拥有的是获取所有内容并创建一个新的User对象,但保留用户名为null。 这是可以理解的,因为我的JSON对象不包含“username”:“value”的键/值对。 Gson gson = new Gson(); JsonParser p = new JsonParser(); JsonReader file = new JsonReader(new FileReader(this.filename)); JsonObject result = p.parse(file).getAsJsonObject().getAsJsonObject(“bjones”); User newUser = gson.fromJson(result, User.class); // newUser.username = null // newUser.fname = “Betty” // newUser.lname = “Jones” […]

如何根据json中的属性编写jackson反序列化器

我想在类Type上编写json反序列化器,这样当基于名称从给定的json反序列化Type时,它会根据某些工厂方法将值(类型为接口Being)映射到其当前实现,该工厂方法根据名称返回正确的类名,并填充剩余的类没有任何明确的反序列化,也没有明确地使用new创建TigerBeing或HumanBeing的对象。 我试图使用@jsonCreator,但我必须使用new初始化整个HumanBeing或TigerBeing并在构造函数中传递所有json。 我需要自动映射进一步用作进一步pojo的类型可能非常复杂。 {type:[{ “name”: “Human”, “value”: { “height”:6, “weight”:100, “languages”:[“spanish”,”english”] } }, { “name”:”Tiger”, “value”:{ “extinct”:1, “found”:[“Asia”, “America”, “Europe”, “Africa”] } } ]} I have: public class Type { String name; Being value; } public interface Being { } public class TigerBeing implements Being { Integer extinct; String[] found; } public class HumanBeing implement […]

如何在OpenJDK(Android 7+)中反序列化对象,该对象已在Apache Harmony(Android * -6)中序列化?

我的应用程序使用http://prevayler.org/进行持久化,捎带Java对象序列化。 升级到Android 7.0(Nougat)后,用户无法打开他们的数据,因为反序列化不再起作用: java.io.StreamCorruptedException: invalid type code: 71 at java.io.ObjectInputStream.readString(ObjectInputStream.java:1647) at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1737) … at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) at org.prevayler.foundation.serialization.JavaSerializer.readObject(JavaSerializer.java:34) … at org.prevayler.PrevaylerFactory.snapshotManager(PrevaylerFactory.java:368) at org.prevayler.PrevaylerFactory.create(PrevaylerFactory.java:316) at com.tennismath.prevayler.PrevaylerServiceImpl.getSystemPrevayler(PrevaylerServiceImpl.java:51) 在反序列化枚举时,OpenJDK例程读取意外的字节值“71”并抛出exception,从源代码可以看出: http : //grepcode.com/file/repository.grepcode.com/java/根/ JDK /的openjdk / 8u40-B25 / JAVA / IO / ObjectInputStream.java#ObjectInputStream.readString%28boolean%29 我有以下想法: 设置迁移服务器,该服务器将运行Harmony和OpenJDK进程,这些进程将执行数据迁移。 破解二进制格式并修复枚举序列化(假设它是唯一的一个问题,我怀疑) 使用AspectJ破解反序列化 所有这些选择似乎都是矫枉过正或不满意。 在我开始攻击二进制文件之前,也许任何人都可以更好地了解如何使用新的运行时对旧数据进行反序列化? 谢谢。

如何使用Gson处理具有相同属性名称的不同数据类型?

我目前正在使用Gson在Java中编写RSS提要解析器。 我正在将RSS’XML转换为JSON,然后使用Gson将JSON反序列化为Java POJO(有点迂回,但有一个原因)。 对于下面列出的Feed#1( BBC )进行反序列化,一切都运行正常,但对于下面列出的Feed#2( NPR ),我开始抛出exception。 我想我已经确定了问题,但我不确定如何解决它: 问题出现在这两个RSS源(例如): http://feeds.bbci.co.uk/news/rss.xml http://www.npr.org/rss/rss.php?id=1001 对于这些不同的RSS源,称为“guid”的字段作为a)具有2个字段的对象 (如在BBC RSS Feed中)或b) 字符串 (如在NPR RSS Feed中)返回。 以下是相关JSON的一些释义版本: BBC RSS Feed // is returning ‘guid’ as an object “item” : [ { // omitted other fields for brevity “guid” : { “isPermalink” : false, “content” : “http:\/\/www.bbc.co.uk\/news\/uk-england-33745057” }, }, { // … […]