コンセプト
私にとって最善の解決策は、PubNub API の s を、 XChange ライブラリJSONObject
の MtGox モジュールで見つけた Bean クラスに変換することでした。
確かに、この回答の最後にあるように、このアプローチではかなりの量のグルー コードが追加されますが、変換後はコードがはるかに単純になるため、苦労する価値があると思います。たとえば、BTC が最後に取引されたティッカーからレートと通貨を取得するには、単純に次のように記述します。
ticker.getLast().getValue()
と
ticker.getLast().getCurrency()
どうやってするの
XChange ライブラリのmtgox モジュールは maven アーティファクト として提供されており、非常に便利です。このモジュールを依存関係としてプロジェクトに追加するだけで、プロジェクトのセットアップは完了です。
xchange-mtgox モジュールには、2 つのcalssesMtGoxTrade
とMtGoxTicker
.
JSONObject
Jackson を使用すると、これらのクラスの 1 つに簡単に変換できObjectMapper
ます。利点として、Jackson ライブラリは xchange-mtgox maven アーティファクトの推移的な依存関係として自動的にインポートされます。つまり、maven を使用している場合、コードを 1 行も書かなくてもプロジェクトに追加できます。
以下は、完全に実行可能な例です。ほとんどは、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 です)。
さらに、このコードにはパフォーマンスの低下があることに注意してください。これは
、org.json.JSONObject を POJO に効率的にマップする方法についての質問への回答に従うことで回避できます。