使用 Jackson 从 JSON API 响应生成不同的 Java 对象
Generate different Java Objects from JSON API Response using Jackson
我目前正在做一个项目,需要我接受各种货币对并根据 API 调用响应生成响应对象。我正在使用 jackson 将 JSON 响应映射到 java 对象,然后从生成的 ArrayList 中读取数据。问题是 JSON 响应可以将不同的货币配对字符串作为配对数据列表的键。以下是典型的响应:
{"error":[],"result":{"XXBTZUSD":[[1647062100,"39091.2","39184.9","39088.9","39139.0","39150.9","59.22447291",161],}[1647063000,"39138.9","39188.4","39138.9","39151.2","39174.2","2.92905848",126]]}
当我尝试从不同的货币对提取数据时出现问题,因为我的结果对象被硬编码为提取 JSON 键 XXBTZUSD 的数据。这是我的结果对象的样子:
public class Result{
@JsonProperty("XXBTZUSD")
public ArrayList<ArrayList<Object>> candles;
public int last;
}
我在考虑让 @JsonProperty 是可变的,并从 json 响应中传入密钥以正确拉出我设置的货币对,但 JsonProperty 需要是一个常量。我能看到的解决这个问题的唯一方法是为每个货币对设置大量不同的 类,但这效率低下并且需要大约 15 个单独的 类 来完成。我对杰克逊图书馆不太熟悉。如果有人对如何解决这个问题有任何想法,我将不胜感激,我一直在努力寻找解决这个问题的方法。谢谢!
如果密钥可以不同,一种选择是使用 Map
。您的 Result
class 将不需要,将结果 属性 解析为 Map<String, Object>
。然后像这样提取:
Map<String, Object> result = deserialize();
ArrayList<ArrayList<Object>> arrays = (ArrayList<ArrayList<Object>>) result.get("XXBTZUSD");
只需根据您需要的货币对更改 属性。
另一种选择是编写自定义反序列化程序,其中始终将值放入 candles
字段,无论 属性 在 json 中如何命名。
我目前正在做一个项目,需要我接受各种货币对并根据 API 调用响应生成响应对象。我正在使用 jackson 将 JSON 响应映射到 java 对象,然后从生成的 ArrayList 中读取数据。问题是 JSON 响应可以将不同的货币配对字符串作为配对数据列表的键。以下是典型的响应:
{"error":[],"result":{"XXBTZUSD":[[1647062100,"39091.2","39184.9","39088.9","39139.0","39150.9","59.22447291",161],}[1647063000,"39138.9","39188.4","39138.9","39151.2","39174.2","2.92905848",126]]}
当我尝试从不同的货币对提取数据时出现问题,因为我的结果对象被硬编码为提取 JSON 键 XXBTZUSD 的数据。这是我的结果对象的样子:
public class Result{
@JsonProperty("XXBTZUSD")
public ArrayList<ArrayList<Object>> candles;
public int last;
}
我在考虑让 @JsonProperty 是可变的,并从 json 响应中传入密钥以正确拉出我设置的货币对,但 JsonProperty 需要是一个常量。我能看到的解决这个问题的唯一方法是为每个货币对设置大量不同的 类,但这效率低下并且需要大约 15 个单独的 类 来完成。我对杰克逊图书馆不太熟悉。如果有人对如何解决这个问题有任何想法,我将不胜感激,我一直在努力寻找解决这个问题的方法。谢谢!
如果密钥可以不同,一种选择是使用 Map
。您的 Result
class 将不需要,将结果 属性 解析为 Map<String, Object>
。然后像这样提取:
Map<String, Object> result = deserialize();
ArrayList<ArrayList<Object>> arrays = (ArrayList<ArrayList<Object>>) result.get("XXBTZUSD");
只需根据您需要的货币对更改 属性。
另一种选择是编写自定义反序列化程序,其中始终将值放入 candles
字段,无论 属性 在 json 中如何命名。