json - 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"}
}]
}
}
解决方案
推荐阅读
- sql - 如何在presto sql中将不同的行值变成列
- .net-core - Soap Core 注册 IFaultExceptionTransformer 失败
- c# - 谷歌表 - 单元格中的自动格式化代码块(如果可能,C#)
- flutter - 颤振 - 没有为“对象”类型定义吸气剂“消息”
- node.js - Mocha、Node、chai、sinon 单元测试并没有按预期工作
- database - EFCore 3.x 在旧版上创建新的 DbContext
- postgresql - postresql 中的关系表
- typescript - 类型“布尔”不能分配给类型“U[T]”
- r - “'dimnames' [1] 的长度不等于数组范围”的 querygrain() 问题
- ssh - 从 ssh 运行时,巧克力安装挂起