首页 > 解决方案 > Jackson Json Map 或 Key 反序列化器数组数据到 Java hashmap

问题描述

杰克逊和 json 的新手,所以如果我不够清楚,我会道歉。

我已经看到一些对 Key 和 Map Deserializers 的引用,它们可能更适合我想做的事情,但我无法找到一个具体的例子来说明如何将它们组合在一起。

我正在寻找将 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);

}

反序列化类

 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"} }] } }

标签: jsonjacksonapache-camel

解决方案


推荐阅读