如果你有一些代码显示你开始自己解决这个问题,那就太好了。但是,这是一个示例自定义反序列化器,它几乎可以满足您的需求:
class PersonDeserializer extends JsonDeserializer<Person> {
@Override
public Person deserialize(final JsonParser parser,
final DeserializationContext content) throws IOException,
JsonProcessingException {
final ObjectCodec codec = parser.getCodec();
final JsonNode node = codec.readTree(parser);
final Person person = new Person();
final Iterator<String> fieldNameIter = node.getFieldNames();
while (fieldNameIter.hasNext()) {
final String fieldName = fieldNameIter.next();
if (fieldName.equalsIgnoreCase("EMAIL")) {
person.setEmail(node.get(fieldName).getTextValue());
} else if (fieldName.equalsIgnoreCase("NOM")) {
person.setFirstName(node.get(fieldName).getTextValue());
} else if (fieldName.equalsIgnoreCase("PRENOM")) {
person.setLastName(node.get(fieldName).getTextValue());
} else if (fieldName.equalsIgnoreCase("VILLE")) {
person.setTown(node.get(fieldName).getTextValue());
} else if (fieldName.startsWith("LIKE")) {
person.addLike(Liking.LikingType.LIKE, node.get(fieldName)
.getTextValue());
} else if (fieldName.startsWith("HATE")) {
person.addLike(Liking.LikingType.HATE, node.get(fieldName)
.getTextValue());
}
}
return person;
}
}
它假定一个Liking
与此类似的对象:
public class Liking {
public static enum LikingType {
LIKE, HATE;
}
private LikingType type;
private String value;
// Constructors, getters/setters
}
Person
我认为你可以弄清楚你的对象的一些变化。如果您打算以相同的自定义格式将对象序列化为 JSON,则必须编写相应的JsonSerializer
.
另一种不太可靠的选择是过于简单地使用地图来完全按原样存储好恶。该解决方案将省略喜欢/不喜欢的任何显式映射,并利用@JsonAny
注释来捕获它们。在这个方案中,Person 对象看起来像这样:
public class Person {
private String lastName;
private String firstName;
private String email;
private String town;
@JsonAny
private Map<String, Object> otherProperties;
// Constructors, getters/setters
}
将您的 JSON 反序列化为这个修改后的版本,Person
会将所有无法识别的属性作为键值对放入哈希映射中。