假设我在JSON中有一组像这样定义的人。
{
"NOM": "Doe",
"PRENOM": "John",
"EMAIL": "john.doe@email.me",
"VILLE": "Somewhere",
"LIKE1": "Lolcats",
"LIKE2": "Loldogs",
"LIKE3": "Lolwut",
"HATE1": "Bad stuff",
"HATE2": "Bad bad stuff"
}
是否可以编写一个将聚合的JsonDeserializer并将LIKE *和HATE *字段转换为Liking的集合,设置为Person的属性? (注意,只有LIKE1,LIKE2,LIKE3,HATE1,HATE2。)
最终结果属性如下:
public class Person {
private final String lastName;
private final String firstName;
private final String email;
private final String town;
private final Collection<Liking> likings;
// c-tor, getters
}
我已经有了可以将给定LIKE * / HATE *属性反序列化为Liking对象的逻辑,但我无法理解聚合并将它们添加到Person LIking属性。
提前谢谢!答案 0 :(得分:1)
我很确定你不能按照你想要的方式去做,这样做怎么样:
{
"NOM": "Doe",
"PRENOM": "John",
"EMAIL": "john.doe@email.me",
"VILLE": "Somewhere",
"likings": ["Lolcats", "Loldogs", "LIKE3": "Lolwut", "Bad stuff", "Bad bad stuff" ]
}
答案 1 :(得分:1)
如果你有一些代码表明你自己开始解决这个问题的过程,那就太好了。但是,这里有一个示例自定义反序列化器,可以完成你正在寻找的东西:
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
的修改版本会将所有无法识别的属性作为键值对放入哈希映射中。