Джексон JSON Map или данные массива ключей десериализатора в Java hashmap - PullRequest
0 голосов
/ 04 октября 2019

Новичок в Джексоне и Джсоне, поэтому я прошу прощения, если я не достаточно ясен.

Я видел некоторые ссылки на десериализаторы ключей и карт, которые могут лучше подходить для того, что я хочу сделать, но яне удалось найти конкретный пример того, как они будут составлены.

Я ищу лучший способ десериализации массива 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"} }] } }

...