概念
对我来说,最好的解决方案是将 PubNub API 中的 JSONObjects 转换为我在 XChange library 的 MtGox 模块中找到的 bean 类。
承认,正如您在这个答案的末尾看到的那样,这种方法添加了相当多的胶水代码,但我认为这是值得的,因为在转换之后,代码变得更加简单。例如。要从 BTC 最后交易的股票代码中获取汇率和货币,您可以简单地写
ticker.getLast().getValue()
和
ticker.getLast().getCurrency()
怎么做
mtgox module of the XChange library is available as a maven artifact,很方便。您只需将此模块作为依赖项添加到您的项目中,项目设置就完成了。
在 xchange-mtgox 模块中,您会发现包 com.xeiam.xchange.mtgox.v2.dto.marketdata 带有两个名称 MtGoxTrade 和 MtGoxTicker。
使用 Jackson ObjectMapper 可以轻松地从 JSONObject 转换为这些类之一。作为一个优势,Jackson library 会作为 xchange-mtgox maven 工件的传递依赖项自动导入。这意味着如果您使用的是 maven,您甚至不必编写一行代码即可将其添加到您的项目中。
下面是一个完整的可运行示例。大多数是使用 PubNub 的标准代码。重要的位在标记// BEGIN OF IMPORTANT PART 和// END OF IMPORTANT PART 之间。
public class PubNubMtGoxBeanExample {
private static final String MTGOXPUBNUB_SUBSCRIBE_KEY = "sub-c-50d56e1e-2fd9-11e3-a041-02ee2ddab7fe";
private static final String MTGOXPUBNUB_BTCEUR_CHANNEL = "0bb6da8b-f6c6-4ecf-8f0d-a544ad948c15";
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
static {
OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public static void main(String[] args) throws PubnubException {
Pubnub pubnub = new Pubnub("demo", MTGOXPUBNUB_SUBSCRIBE_KEY);
pubnub.subscribe(MTGOXPUBNUB_BTCEUR_CHANNEL, new Callback() {
@Override
public void successCallback(String channel, Object message) {
// BEGIN OF IMPORTANT PART
JSONObject messageJson = (JSONObject) message;
JSONObject tickerJson;
try {
tickerJson = messageJson.getJSONObject("ticker");
} catch (JSONException e) {
throw new RuntimeException(e);
}
MtGoxTicker ticker;
try {
// the following line is the most important, because it maps from the JSONObject to the MtGoxTicker class
ticker = OBJECT_MAPPER.readValue(tickerJson.toString(), MtGoxTicker.class);
} catch (JsonParseException e) {
throw new RuntimeException(e);
} catch (JsonMappingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
String currency = ticker.getLast().getCurrency();
BigDecimal value = ticker.getLast().getValue();
System.out.println(currency + " " + value);
// END OF IMPORTANT PART
}
@Override
public void connectCallback(String channel, Object message) {
System.out.println("connectCallback on channel:" + channel + " : " + message.getClass() + " : " + message.toString());
}
@Override
public void disconnectCallback(String channel, Object message) {
System.out.println("disconnectCallback on channel:" + channel + " : " + message.getClass() + " : " + message.toString());
}
@Override
public void reconnectCallback(String channel, Object message) {
System.out.println("reconnectCallback on channel:" + channel + " : " + message.getClass() + " : " + message.toString());
}
@Override
public void errorCallback(String channel, PubnubError error) {
System.out.println("errorCallback on channel " + channel + " : " + error.toString());
}
});
}
}
为了清楚起见,我删除了导入,您可以在大多数 IDE 中使用适当的热键重新添加(在 Eclipse 中为 Ctrl+Shift+O)。
此外,请注意,此代码中存在性能损失,可以通过遵循问题的答案来避免
How to efficiently map a org.json.JSONObject to a POJO?