java - 从 Json 数据中排除属性而不反序列化它

标签 java json jackson

我有这样的 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/

相关文章:

java - 没有 Spring Security ACL 的 Spring 对象级权限

java - 对于 HashMap,我应该重写键或值的 hashCode 吗?

java - 如何在一定时间后关闭阶段 JavaFX

java - Jersey Web 服务中的 JSON 数据未正确传输

ajax - 减少从 AJAX/JSON 服务收集数据的技术

java - 如何仅针对给定的单个端点忽略 JsonProperty 并让它适用于其他端点

java - 如何使注入(inject)的对象映射器输出特定于区域设置

java - Sun、音频播放器和声音 I/O

json - 从 JSON 值中过滤某些(子)键

java - 如何在序列化期间忽略字段,但在反序列化期间不忽略?