我有这样的 Json 数据:
{
"_id": "123",
"transaction": {
"className": "ExpenseReport",
"id": "789",
"createdBy": {
"firstName": "Donald",
"lastName": "Morgan",
"address": {
"street1": "1362 Woodlawn Lane",
"street2": "Suite #100805",
"place": {
"city": "Darien",
"state": "CA",
"country": "USA",
"number": "OBJ-4823478",
"createdBy": "Brett Wright"
},
"zip": 88884,
"number": "OBJ-5740231",
"createdBy": "Brett Wright"
},
"number": "OBJ-3561551",
"createdBy": "Brett Wright"
},
"score": 12,
"reasonCodes": [
"these",
"are",
"strings"
]
}
}
我想要排除某些属性后的数据子集,如下所示:
{
"_id": "123",
"transactionType": "EXPENSE_REPORT",
"transaction": {
"className": "ExpenseReport",
"id": "789",
"createdBy": {
"firstName": "Donald",
"lastName": "Morgan",
"address": {
"street1": "1362 Woodlawn Lane",
"street2": "Suite #100805",
"place": {
"city": "Darien",
"state": "CA",
"country": "USA"
},
"createdBy": "Brett Wright"
},
"createdBy": "Brett Wright"
},
"score": 12
}
}
现在一种方法是将原始 json 数据反序列化为 POJO,使用 Jackson Views注解所需的属性,然后再次序列化同一个POJO,得到不带属性的Json数据。
但我想实现这样的目标:不反序列化 Json 数据,例如通过解析 json 数据并删除键值对(如果在集合中找不到它们)。有人知道有这样做的图书馆吗?
最佳答案
Jackson 允许您仅使用 ObjectMapper.readTree()
执行解析步骤。
JsonNode root = om.readTree(input);
生成的 JsonNode
是可变的,因此类似这样的东西可以完成这项工作:
ObjectNode place = (ObjectNode)(root.findPath("transaction")
.findPath("createdBy")
.findPath("address")
.findPath("place")
);
place.remove("number");
不幸的是,这不太好,但可以轻松包装到采用属性路径的通用方法中:
void deleteProperty(JsonNode root, List<String> propPath)
{
JsonNode node = root;
for (String propName: propPath.subList(0, propPath.size() - 1)) {
node = node.findPath(propName);
}
// completely ignore missing properties
if ((! node.isMissingNode()) && (! node.isEmpty())) {
if (node instanceof ObjectNode) {
final ObjectNode parent = (ObjectNode)node;
parent.remove(propPath.get(propPath.size() - 1));
}
}
}
然后可以使用 writeTree()
写出修改后的节点树。
还有property filter API 。不幸的是,虽然用它过滤掉单个属性很容易,但它是 non-trivial to use it对于属性路径。例如,在您的情况下,普通过滤器只能过滤掉所有 createdBy
属性。
关于java - 从 Json 数据中排除属性而不反序列化它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32265056/