【问题标题】:How do I deserialize flat JSON into multiple instances of a sub-class?如何将平面 JSON 反序列化为子类的多个实例?
【发布时间】:2017-07-25 13:43:48
【问题描述】:

我有一个扁平的 JSON 字符串,例如

{"ccy":"EUR", 
 "value1":500, 
 "value2":200, 
 "date":"2017-07-25", 
 "type":"", 
 ... <many other pairs>}

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

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) {...} 的简洁解决方案?

edit:使用 Jackson 的方法将是首选。

【问题讨论】:

    标签: java json annotations jackson


    【解决方案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>
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回复。我不确定在我的示例中如何正确应用 GSON。你能提供一些代码吗?
    • 使用相同的方法。当您挑战您的两个实例时,请在提供的示例的第 3 行使用我的方法(实例化原子类用户)
    • 在实例化你的类数据时试一试,通过使用 System.out 或调试你可以看到你的变量被传入的数据填充。但是您必须确保您的 Json 应根据 Class Data 100% 正确格式化
    • 我看不出这是如何工作的。我无法直接访问 Data 类中的 JSON 字符串。另外我应该把哪些字段属于Amount value1和哪些字段属于Amount value2的信息放在哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多