将 JSON 子对象属性绑定到 Jackson 中的 Java 对象字段

发布于 2024-10-03 00:56:30 字数 413 浏览 4 评论 0原文

我有一个 JSON 对象,比如说:

{
  "foo": {
    "bar": 1
  },
  "baz": 2
}

我想将它绑定到一个 Java 对象中,例如:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
  private int bar;
  @JsonProperty("baz")
  private int baz;
}

如何将 JSON 中的 foo.bar 的值设置为 bar 。 Foo Java 对象中的字段?

我尝试使用 @JsonProperty("foo.bar") 注释该字段,但它不起作用。

I have a JSON object, say:

{
  "foo": {
    "bar": 1
  },
  "baz": 2
}

and I want to bind it into a Java object, like:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
  private int bar;
  @JsonProperty("baz")
  private int baz;
}

How can I set the value of foo.bar from JSON to the bar field in the Foo Java object?

I've tried annotating the field with @JsonProperty("foo.bar"), but it doesn't work like that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

橘和柠 2024-10-10 00:56:30

这并不完美,但这是我能想到的最优雅的方式。

@JsonProperty("foo")
public void setFoo(Map<String, Object> foo) {
  bar = (Integer) foo.get("bar");
}

This ain't perfect but it's the most elegant way I could figure out.

@JsonProperty("foo")
public void setFoo(Map<String, Object> foo) {
  bar = (Integer) foo.get("bar");
}
莫言歌 2024-10-10 00:56:30

没有自动功能(据我所知),但这是一个经常被要求的功能;有这个 Jira RFE:http://jira.codehaus.org/browse/JACKSON-132 这听起来像是您正在寻找的。

There is no automated functionality for this (as far as I know), but this is a somewhat often requested feature; there is this Jira RFE: http://jira.codehaus.org/browse/JACKSON-132 that sounds like what you are looking for.

层林尽染 2024-10-10 00:56:30

这是一个有效的简单示例:

JSON:

[{"function":{"name":"Function 1"}},
 {"function":{"name":"Function 2"}}]

Java:

import java.util.Map;

import javax.xml.bind.annotation.XmlRootElement;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
@Getter
@Setter
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class Function {
    @JsonProperty("name")
    private String name;

    @JsonProperty("function")
    public void setFunction(Map<String, Object> function) {
      name = (String) function.get("name");
    }
}

Here a quick example that works:

JSON:

[{"function":{"name":"Function 1"}},
 {"function":{"name":"Function 2"}}]

Java:

import java.util.Map;

import javax.xml.bind.annotation.XmlRootElement;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
@Getter
@Setter
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class Function {
    @JsonProperty("name")
    private String name;

    @JsonProperty("function")
    public void setFunction(Map<String, Object> function) {
      name = (String) function.get("name");
    }
}
可爱暴击 2024-10-10 00:56:30

这就像将苹果绑在橙子上一样!另一个“朗朗上口的短语”是“阻抗不匹配”,或者在《星际迷航 1》中是“非 Sequetor!”将其绑定为 MATCHED 对象,然后在 Java 中在不同类型的对象之间进行新的赋值。

That's like binding an apple to an orange! Another 'catchy phrase' would be, "Impedance Mismatch", or in Star Trek 1, "Non Sequetor!" Bind it a MATCHED object, then do new assignment in Java between the different kinds of objects.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文