Новичок в Джексоне и Джсоне, поэтому я прошу прощения, если я не достаточно ясен.
Я видел некоторые ссылки на десериализаторы ключей и карт, которые могут лучше подходить для того, что я хочу сделать, но яне удалось найти конкретный пример того, как они будут составлены.
Я ищу лучший способ десериализации массива JSON в Hashmap, где ключом hashmap является одно из значений - переданный массив JSON. Это может быть либо изменение в JSON, либо изменение в сериализации.
Это мой текущий прототип дизайна кода. в конечном итоге это станет частью верблюжьего маршрута.
Родительский класс
@XmlRootElement(name = "EligibilityUnit")
@XmlAccessorType(XmlAccessType.FIELD)
public class EligibilityUnit implements Serializable {
private static final long serialVersionUID = 3456126687901598200L;
@XmlElement(name = "EligibilityUnitUUID")
protected int eligibilityUnitUUID;
@JsonProperty("eligibilityMembers")
@JsonDeserialize(using = Elig4Deserializer.class) // JSONtoMap2
protected HashMap<Integer, EligibilityMember> eligibilityMembers;
public EligibilityUnit() {
super();
eligibilityUnitUUID = Math.abs(UUID.randomUUID().hashCode());
}
public Map <Integer,EligibilityMember> getEligibilityMembers() {
return eligibilityMembers;
}
public void setEligibilityMembers(HashMap<Integer, EligibilityMember> eligibilityMembers) {
this.eligibilityMembers = eligibilityMembers;
}
... getters/setters
}
Дочерний класс
@XmlRootElement(name = "EligibilityMember")
@XmlAccessorType(XmlAccessType.FIELD)
public class EligibilityMember implements Serializable {
private static final long serialVersionUID = -5943362268820173933L;
Integer personId;
String firstName;
String lastName;
//... getters/setters
}
Тестовая программа
public static void main(String[] args)
{
String json =
"{"+
"\"eligibilityMembers\": " +
"["+
"{"+
"\"personId\": 11,"+
"\"firstName\": \"Jane\","+
"\"lastName\": \"Jones\""+
"},"+
"{"+
"\"personId\": 12,"+
"\"firstName\": \"Tiffany\","+
"\"lastName\": \"Roberts\""+
"},"+
"{"+
"\"personId\": 13,"+
"\"firstName\": \"Janika\","+
"\"lastName\": \"Brown\""+
"}"+
"]"+
"}";
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Object map = mapper.readValue(json, EligibilityUnit.class);
//Convert Map to JSON
String jsonOut = mapper.writeValueAsString(map);
//Print JSON output
System.out.println(jsonOut);
}
Deкласс -сериализации
public class Elig4Deserializer extends JsonDeserializer {
public Elig4Deserializer() {
super();
}
@Override
public Object deserialize(JsonParser arg0, DeserializationContext arg1)
throws IOException, JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = arg0.readValueAsTree();
String json = node.toString();
Object map = null;
Map<Integer,EligibilityMember> mapx = new HashMap<Integer,EligibilityMember>();
CollectionType javaType = mapper.getTypeFactory()
.constructCollectionType(List.class, EligibilityMember.class);
List<EligibilityMember> members = mapper.readValue(json, javaType);
for (EligibilityMember i : members) mapx.put(i.getPersonId(),i);
return (Object) mapx;
}
}
Это json из класса
{"eligibilityUnit":1062082797,"eligibilityMembers":{"11": {"personId":11,"personSSN":null,"personNumber":null,"primeNumber":null,"individualId":null,"firstName":"Jane","lastName":"Jones"},"12":{"personId":12,"personSSN":null,"personNumber":null,"primeNumber":null,"individualId":null,"firstName":"Tiffany","lastName":"Roberts"},"13":{"personId":13,"personSSN":null,"personNumber":null,"primeNumber":null,"individualId":null,"firstName":"Janika","lastName":"Brown"}}}
Это лучший способ справиться с этим? Я видел много частичных решений, но ничего, что вполне соответствует тому, что я пытаюсь сделать.
Реально, я бы предпочел, чтобы JSON был чем-то вроде этого (я понимаю, формат на этом не может быть на 100% правильным, я публикую его как то, куда я хотел бы пойти. Это все еще работав процессе)
{"eligibilityMembers":
[{
"personId":11,
{"firstName":"Jane","lastName":"Jones",
"Income"
[{"IE-ME":
[{"Wages":1434.34,"support":535.99}],
"FS":
[{"Misc":60.00,"SSI":754.55}],
"CM":
[{"Support":535.99}],
}]
"Expenses":
[{"IE-ME":
[{"Rent":908.90,"Utilities":45.99}],
"DCS":
[{"Misc":60.00,"ChildCare":754.55}]
}]
},
{"personId":12,
{"firstName":"Tiffany","lastName":"Roberts"
"Income"
[{"IE-ME":
[{"Wages":1.34}],
"FS":
[{"SSD":50.55}],
"CSC":
[{"Support":535.99}],
}]
"Expenses":
[{"IE-ME":
[{"Rent":400.15,"Utilities":80.86}]
}]
},
{"personId":13,
{"firstName":"Janika","lastName":"Brown"}
}]
}
}