【问题标题】:How to ignore Map related braces while converting json to Java object using Jackson使用 Jackson 将 json 转换为 Java 对象时如何忽略 Map 相关的大括号
【发布时间】:2019-02-28 20:06:56
【问题描述】:

我正在尝试将 JSON 转换为 Java 对象,但我很难构建 Java 等效对象。

我的 JSON 看起来像这样

{
    "point1": {
        "x": 1.0,
        "y": 2.0
    },
    "point2": {
        "x": 1.0,
        "y": 2.0
    },
    "point3": {
        "x": 1.0,
        "y": 2.0
    },
    "customobject1": "cust1",
    "customobject2": "cust2"
}

这里需要取地图来取点,因为会有n个点,

public class Test {

    public String getCustomobject1() {
        return customobject1;
    }

    public void setCustomobject1(String customobject1) {
        this.customobject1 = customobject1;
    }

    public String getCustomobject2() {
        return customobject2;
    }

    public void setCustomobject2(String customobject2) {
        this.customobject2 = customobject2;
    }

    Map<String, Point> testing  = new HashMap<>();

    String customobject1;
    String customobject2; 

    public Map<String, Point> getTesting() {
        return testing;
    }

    public void setTesting(Map<String, Point> testing) {
        this.testing = testing;
    }

}

但是我遇到了无法识别的属性异常,我知道有一个额外的包装器 ({}) 会导致此问题,有人可以建议我在反序列化 JSON 时如何忽略此地图名称吗?

注意:我正在工作的实际对象有点复杂,结构相似,我在这里只发布一个原型。

【问题讨论】:

  • 您的“pointX”实际上是根对象的属性,所以杰克逊绝对不会将它们映射到“测试”属性。也许其他问题的答案会对您有所帮助:stackoverflow.com/questions/31164625/…。您可以将它们分配给自己在 setter 中映射
  • @uaraven 感谢您提供信息。

标签: java jackson jackson-databind


【解决方案1】:

如果您事先不知道密钥,请使用@JsonAnySetter 进行映射:

可用于定义非静态、双参数方法(属性的第一个参数名称,要设置的第二个值)的标记注释,用作从 JSON 中找到的所有其他无法识别的属性的“后备”处理程序内容。它在行为上类似于 XmlAnyElement;并且只能用于表示每种类型的单个属性。

如果使用,所有来自 JSON 对象值的未映射键值对都将添加到属性(类型为 Map 或 bean)。

public class Test  {
  private Map<String, Point> points = new HashMap<>();

  @JsonAnySetter
  public void setPoints(String name, Point value) {
    points.put(name, value);
  }

}

【讨论】:

  • 感谢您的快速回复。我实际上看到了@JsonAnySetter,但我并没有真正完成完整的答案,只是在我的地图设置器上保留了这个注释并希望它能够工作,但现在我从你的回答中意识到它应该在后备方法之上使用我们很可能会在其中添加未知属性的值。感觉有点笨。
猜你喜欢
  • 1970-01-01
  • 2020-09-07
  • 2013-03-25
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2017-02-04
  • 2015-06-03
相关资源
最近更新 更多