【问题标题】:Binding JSON child object property into Java object field in Jackson将 JSON 子对象属性绑定到 Jackson 中的 Java 对象字段
【发布时间】:2011-05-11 03:09:17
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java json data-binding jackson


    【解决方案1】:

    这里有一个简单的例子:

    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");
        }
    }
    

    【讨论】:

    • 为什么需要在你的答案中包含一堆龙目岛的东西?如果没有这些,它实际上会产生相同的结果。
    【解决方案2】:

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

    【讨论】:

    • 不是很有帮助。我不想仅仅因为有人无法设计出像样的 JSON API 而创建无用的 Java 类。
    • 同意@hleinone。一个人并不总是能够控制 API,并且必须创建嵌套类/地图/hacks/voodoo 不是正确的解决方案。
    【解决方案3】:

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

    【讨论】:

    • 是的,这是同一个问题,虽然我会用它来反序列化。如果我不想更改 Foo 对象的结构,我想我上面的解决方案是我能得到的最好的解决方案。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2021-05-04
      • 2020-06-22
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 2013-03-14
      相关资源
      最近更新 更多