我很难想出一个代表以下JSON的类。 " familyRelationships"是一个数组数组。每个数组都有person1和person2标识符以及person1和person2之间的关系。正如您可能已经猜到的那样,数组中值的顺序非常重要。例如,如果" 12345"和" 31142"位置开关,则表示" 31142"是" 12345"的父母。这是完全错误的。
{
"familyRelationships": [
[
"12345",
"SPOUSE",
"67890",
{
"careTaker": false,
"liveTogether": true
}
],
[
"12345",
"PARENT",
"31142",
{
"careTaker": true,
"liveTogether": true
}
],
[
"67890",
"PARENT",
"31142",
{
"careTaker": true,
"liveTogether": true
}
]
]
}
答案 0 :(得分:1)
JSON不能很好地成为POJO,因为数组中包含的类型不一致:
e.g。
[
"12345",
"SPOUSE",
"67890",
{
"careTaker": false,
"liveTogether": true
}
]
是String,String,String,Object
。唯一可行的方法是,如果您有Object[]
或List<Object>
。因此familyRelationships
实际应该是List<List<Object>>
。最终的结果是需要一堆强制转换(并且可能需要进行一些检查以确保给定索引处的项是您期望的类),但它会起作用。
答案 1 :(得分:1)
使用自定义反序列化器应该可行。
我认为关系应该被建模为具有正确名称的正确java类。请注意,构造函数使用JSONNode
作为参数,并且我已经离开了我们的任何getter和setter:
public class Relationship {
private final String id1;
private final String id2;
private final Relation relation;
private final boolean careTaker;
private final boolean liveTogether;
public Relationship(JsonNode base) {
this.id1 = base.get(0).asText();
this.id2 = base.get(2).asText();
this.relation = Relation.valueOf(base.get(1).asText());
this.careTaker = base.get(3).get("careTaker").asBoolean();
this.liveTogether = base.get(3).get("liveTogether").asBoolean();
}
public enum Relation {
PARENT,
SPOUSE;
}
}
我们还需要一个存储集合的类。这是您将顶级对象反序列化为(再次省略getter和setter)的那个:
@JsonDeserialize( using = FamillyRelationshipsDeserializer.class )
public class FamillyRelationships {
public List<Relationship> familyRelationships = new ArrayList<>();
}
最后,我们需要实现上面类中引用的实际JsonDeserializer
。它看起来应该如下所示。我使用this question作为参考:
class FamillyRelationshipsDeserializer extends JsonDeserializer<FamillyRelationships> {
@Override
public FamillyRelationships deserialize(JsonParser jp, DeserializationContext ctxt) throws
IOException, JsonProcessingException {
FamillyRelationships relationships = new FamillyRelationships();
JsonNode node = jp.readValueAsTree();
JsonNode rels = node.get("familyRelationships");
for (int i = 0; i < rels.size(); i++) {
relationships.familyRelationships.add(new Relationship(rels.get(i));
}
return relationships;
}
}
我希望这有帮助,我还没有真正测试过这一点,它可能甚至不会编译,但原则应该是正确的。我还假设JSON是您提供的格式。如果这不是保证,那么您需要进行适当的检查并处理任何偏差。
如果您还希望能够序列化所有内容,那么您需要实施JsonSerializer
,请参阅this question了解详情。
答案 2 :(得分:0)
网上有一些工具可供您使用
package com.example;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"familyRelationships"
})
public class Example {
@JsonProperty("familyRelationships")
private List<List<String>> familyRelationships = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("familyRelationships")
public List<List<String>> getFamilyRelationships() {
return familyRelationships;
}
@JsonProperty("familyRelationships")
public void setFamilyRelationships(List<List<String>> familyRelationships) {
this.familyRelationships = familyRelationships;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
只能做到1次