繁体   English   中英

使用Jackson JSON中的函数反序列化对象

[英]Deserialize object using function in Jackson json

我有一个产生对象的函数。 使用Jackson JSON注释可以反序列化此对象吗?

class Foo{
  Bar getBar(int par1, int par 2){
    ...
  }
  public static void main( String[] args )  {
    String json = "{\"par1\":1,\"par2\":2}";
    Bar bar = new ObjectMapper().<invoke function getBar>.readValue(json);
  }
}

一种实现方法是将此Json String解析为Jacksons JsonNode ,然后调用您的方法。

像这样:

public static void main( String[] args )  {
    String json = "{\"par1\":1,\"par2\":2}";
    JsonNode jsonNode = new ObjectMapper().readValue(json, JsonNode.class);
    Bar bar = Foo.getBar(jsonNode.get("par1").asInt(), jsonNode.get("par2").asInt());
}

可能的解决方法是将par1和par2添加到Foo类中。 但是不要忘记将@JSONIgnore添加到“获取”方法中,这些方法对于json解析没有用。

class Foo{
  int par1;
  int par2;

  @JsonIgnore
  Bar getBar(){
     //..par1 par2 logic;
  }
  int getPar1(){
     return par1;
  }
  void setPar1(int par1) {
     this.par1=par1;
  }
  //same setter\getter for par2
}

然后您可以简单地将JSON解析到该对象并调用Bar方法

String json = "{\"par1\":1,\"par2\":2}";
Bar bar = new ObjectMapper().readValue(json,Foo.class).getBar();

您可以通过@JsonCreator注释告诉Jackson使用工厂方法或非默认构造函数。 但是,该方法必须是反序列化的Class的一部分。 因此,假设Bar有两个args构造函数:

public class Bar {
  @JsonCreator
  public Bar (@JsonProperty("par1") int par1, @JsonProperty("par2") int par 2) {
    ...
  }
  public static void main( String[] args )  {
    String json = "{\"par1\":1,\"par2\":2}";
    Bar bar = (Bar)new ObjectMapper().readValue(json, Bar.class);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM