我正在try 设计一个Java类来保存反序列化JSON格式的消息的结果.这条消息的 struct 很简单:
{
"appId": "MyApp",
"action": "Upsert",
"entityType": "Property",
"entity": {
"marketId": "abc123",
"propertyId": "def456",
"name": "Grand Central Station",
"hasFoo": true,
"hasBar": false,
"areaInSf": 30,000
... more key-value pairs...
}
}
在entity
中,ID和名称字段是必需的,并且它们的名称是已知的.我可能还想反序列化任意数量的其他属性--它们是可选的,而且我事先不知道所有的名称.
如果我只处理已知的字段,我可以创建一个Java模型,如下所示
public class Message {
public String appId;
public String action;
public String entityType;
public Entity entity;
}
public class Entity {
public String marketId;
public String propertyId;
public String name;
}
并使用Jackson反序列化JSON,如下所示:
ObjectMapper om = new ObjectMapper();
Message myMessage = om.readValue(myJsonString, Message.class);
但是我该如何处理消息中的可选字段呢?它们是ID和NAME字段的平面sibling ,而不是嵌套映射,因此我不能这样做
public class Entity {
public String marketId;
public String propertyId;
public String name;
public Map<String, Object> otherFields; // hasFoo, hasBar, areaInSf ...
}
我更喜欢强类型的Entity
,这样我就可以验证所需字段的各个方面--ID的最小长度等.否则,Entity
可能只是Map<String, Object>
.要获取这些字段,我只需循环遍历Map的属性.但我希望能够按名称提取所需的字段,并在可能的情况下只循环剩余的字段.
如何设计实体POJO,以便可以反序列化类定义中声明的两个字段,以及输入JSON中的一些额外字段?