如何将平面JSON反序列化为子类的多个实例?

时间:2017-07-25 13:43:49

标签: java json annotations jackson

我有一个像

这样的扁平JSON字符串
{"ccy":"EUR", 
 "value1":500, 
 "value2":200, 
 "date":"2017-07-25", 
 "type":"", 
 ... <many other pairs>}

JSON字符串应使用Jackson在Java中反序列化:

public class Data
{
  @JsonProperty("ccy")
  private String currency;

  private Amount value1;

  private Amount value2;

  @JsonProperty("date")
  private String date;

  @JsonProperty("type")
  private String type;

  ... <many other members>
}

public class Amount
{
  private double value;

  private String currency;

  public Amount(double value, String currency)
  {
    this.value = value;
    this.currency = currency;
  }
}

正确使用Jackson注释填充Data类中的value1和value2字段是什么?

我尝试过自定义设置器:

@JsonSetter("value1")
private void setValue1(double value1)
{
  this.value1 = new Amount(value1, this.currency);
}

@JsonSetter("value2")
private void setValue2(double value2)
{
  this.value2 = new Amount(value2, this.currency);
}

但这只有在this.currency首先被反序列化时才有效(我不能依赖)。

是否有一个不使用自定义构造函数的简洁解决方案为Data(@JsonProperty("value1") double value1, (@JsonProperty("value2") double value2, (@JsonProperty("ccy") String currency) {...}

编辑:使用杰克逊的方法将是首选。

1 个答案:

答案 0 :(得分:1)

您可以使用GSON库 这是非常简单的方法。假设您的班级是“用户”

Gson gson = new Gson();
String jsonInString = "{\"userId\":\"1\",\"userName\":\"Yasir\"}";
User user= gson.fromJson(jsonInString, User.class);

使用此依赖项

添加它
<dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.6.2</version>
</dependency>

希望这有帮助