从MtGox / PubNub JSON API中提取数据的便捷方式?

我正在使用带有Java的PubNub API从MtGox中提取数据。

在检索数据时,API以JSONObjectforms提供它, JSONObject表示JSON数据的树结构。 试图直接从JSONObject提取信息,会产生丑陋的代码,并且需要对getJSONObject(String)进行大量调用, getJSONObject(String)可能需要处理exception。

因此,我正在寻找一种从JSONObject响应中提取信息的便捷方法。 到目前为止,我已经想到了将JSONObject转换为POJO然后访问POJO的可能性。 为了转换,我在Jackson库中找到了ObjectMapper ,它在这里做得很好:

 public void successCallback(String channel, Object message) { JSONObject messageJson = (JSONObject) message; ObjectMapper mapper = new ObjectMapper(); Message myMessage = mapper.readValue(messageJson.toString(), Message.class); // do stuff with myMessage here } 

这种方法的缺点是我必须编写自己的POJO类,例如上面例子中的Message类,因为我找不到这些类可以在任何地方使用。

如何方便地访问存储在JSONObject的信息?

适用于MtGox JSON API的PubNub Java类

很容易创建一个现成的Java类来摄取Mt.Gox提供的实时源这是一篇正在进行的文章,向您展示如何从开发控制台实时源中显示如何从Mt.Gox访问PubNub数据源!

官方比特币Wiki JSON Streaming API

我们将使用比特币官方Wiki提供的比特币维基提要说明: https : //en.bitcoin.it/wiki/MtGox/API/Pubnub – 继续阅读屏幕截图下方继续。

PubNub开发者控制台

要查看我们将使用的实时实时数据Feed,请查看以下两个链接:

  1. 实时饲料贸易活动(买/卖饲料): https : //www.pubnub.com/console?sub = sub-c-50d56e1e-2fd9-11e3-a041-02ee2ddab7fe &pub = demo&channel = dbf1dee9-4f2e-aa8-8cb7-748919a71b21 &origin = pubsub.pubnub.com&SSL =真
  2. 实时Feed代码更新(价格变动): https : //www.pubnub.com/console?sub = sub-c-50d56e1e-2fd9-11e3-a041-02ee2ddab7fe&pub = demo&channel = d5f06780-30a8-4a48-a2f8-7ed181b4a13f&origin = pubsub .pubnub.com&SSL =真
  3. 贸易滞后示例: https : //www.mtgox.com/lag.html

PubNub Java SDK文档

我们将使用PubNub Java SDK Docs http://www.pubnub.com/docs/java/javase/overview/data-push.html

具体来说,我们将使用mtgox.subcribe(...)实例方法来集中我们的工作,如下所示:

下载JAR或来源: https : //github.com/pubnub/mtgox

 import org.json.JSONObject; import com.pubnub.mtgox.MtGox; import com.pubnub.mtgox.MtGoxCallback; public class PubnubMtGoxSample { public static void main(String[] args) { MtGox mtgx = new MtGox(); mtgx.subscribe("ticker.BTCUSD", new MtGoxCallback(){ @Override public void callback(JSONObject data) { try { String channel_name = data.getString("channel_name"); String avg_value = data.getJSONObject("ticker").getJSONObject("avg").getString("value"); System.out.println(channel_name + " : " + avg_value); } catch (Exception e) {} }}); } } 

使用Java源代码查看完整的MtGox示例 – https://github.com/pubnub/mtgox/blob/master/java/examples/PubnubMtGoxSample.java

编译示例到https://github.com/pubnub/mtgox/tree/master/java并运行

 javac -cp Pubnub-MtGox.jar:libs/json-20090211.jar examples/PubnubMtGoxSample.java 

然后运行:

 java -cp .:examples/:Pubnub-MtGox.jar:Pubnub-StandardEdition-3.5.6.jar:libs/json-20090211.jar:libs/bcprov-jdk15on-1.47.jar:libs/slf4j-api-1.7.5.jar:libs/slf4j-nop-1.7.5.jar PubnubMtGoxSample 

这个概念

对我来说,最好的解决方案是将JSONObject从PubNub API转换为我在XChange库的MtGox模块中找到的bean类。

承认,这种方法增加了相当多的胶水代码,你可以在这个答案的最后看到,但我认为这是值得的,因为在转换之后,代码变得更加简单。 例如,从BTC最后交易的股票代码中获取汇率和货币,您可以简单地写

 ticker.getLast().getValue() 

 ticker.getLast().getCurrency() 

怎么做

XChange库的mtgox模块可作为maven工件使用 ,非常方便。 您只需将此模块添加为项目的依赖项,即可完成项目设置。

在xchange-mtgox模块中,您将找到包含两个MtGoxTradeMtGoxTicker的软件包MtGoxTicker

使用Jackson ObjectMapper可以轻松地从JSONObject转换为其中一个类。 作为优势, Jackson库会自动导入为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)。

Morevoer,请注意此代码中存在性能损失,可以通过关注如何有效地将org.json.JSONObject映射到POJO的问题的答案来避免?