首页 > 解决方案 > 如果字段存在于树的更远位置,则不要序列化

问题描述

我的许多域对象都有一个unit字段。目前,当我序列化时,每个对象都会输出该unit字段:

{
  "projects": [
    {
      "name": "project1",
      "unit": "mm",
      "size": {
        "x": {
          "value": 100,
          "unit": "mm"
        },
        "y": {
          "value": 120,
          "unit": "mm"
        },
        "z": {
          "value": 80,
          "unit": "mm"
        }
      },
      "materials": [
        {
          "type": "wood",
          "unit": "mm",
          "size": {
            "x": {
              "value": 100,
              "unit": "mm"
            },
            "y": {
              "value": 120,
              "unit": "mm"
            },
            "z": {
              "value": 80,
              "unit": "mm"
            }
          }
        },
        ...
      ]
    },
    ...
  ]
}

我需要单个对象拥有该unit属性,因为它们有时会自行序列化。例如

{
  "length": {
    "value": 100,
    "unit": "mm"
  }
}

但是当它嵌套在另一个已经指定 的对象中时unit,会导致大量重复。

unit如果在树的更远处的某个地方已经有一个unit具有相同值的字段,我怎样才能让杰克逊省略该字段?

以下是我想使用相同实例实现的一些示例输出,但只是更改了序列化的根对象:

{
  "projects": [
    {
      "name": "project1",
      "unit": "mm",
      "size": {
        "x": {
          "value": 100
        },
        "y": {
          "value": 120
        },
        "z": {
          "value": 80
        }
      },
      "materials": [
        {
          "type": "wood",
          "size": {
            "x": {
              "value": 100
            },
            "y": {
              "value": 120
            },
            "z": {
              "value": 80
            }
          }
        },
        ...
      ]
    },
    ...
  ]
}
{
  "type": "wood",
  "unit": "mm",
  "size": {
    "x": {
      "value": 100
    },
    "y": {
      "value": 120
    },
    "z": {
      "value": 80
    }
  }
}
{
  "value": 100,
  "unit": "mm"
}

标签: jackson

解决方案


AFAIK 你不能在解析器中添加这样的业务逻辑。您必须在映射器之前按摩数据类。


推荐阅读