0

MtGox からデータを取得するために Java で PubNub API を使用しています。

JSONObjectAPI は、データを取得するときに、JSON データのツリー構造を表す の形式でデータを配信します。から直接情報を抽出しようとするJSONObjectと、大量の への呼び出しを含む醜いコードが生成getJSONObject(String)されます。この場合も、例外を処理する必要がある場合があります。

JSONObjectそのため、応答から情報を抽出する便利な方法を探しています。JSONObjectこれまでのところ、 を POJO に変換してから POJO にアクセスする可能性に遭遇しました。変換のために、ObjectMapperここでうまく機能する Jackson ライブラリからを見つけました。

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?

4

2 に答える 2

2

MtGox JSON API の PubNub Java クラス

Mt.Gox が提供するライブ フィードを取り込むための既製の Java クラスを簡単に作成できます これは、開発コンソールのライブ フィードに表示されるように、Mt.Gox から PubNub データ フィードにアクセスする方法を示す進行中の投稿です。 !

公式 Bitcoin Wiki JSON ストリーミング API

ビットコインの公式 Wiki が提供するビットコイン wiki フィードの説明に基づいて作業を進めます: https://en.bitcoin.it/wiki/MtGox/API/Pubnub - スクリーンショットの下を読み続けて続行します。

PubNub 開発者コンソール

使用するライブ リアルタイム データ フィードを確認するには、次の 2 つのリンクを確認してください。

  1. ライブ フィード取引イベント (売買フィード): https://www.pubnub.com/console?sub=sub-c-50d56e1e-2fd9-11e3-a041-02ee2ddab7fe&pub=demo&channel=dbf1dee9-4f2e-4a08-8cb7-748919a71b21&origin =pubsub.pubnub.com&ssl=true
  2. ライブ フィード ティッカーの更新 (価格変更): 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=true
  3. トレードラグの例: https://www.mtgox.com/lag.html

PubNub Java SDK ドキュメント

PubNub Java SDK ドキュメント 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
于 2013-12-12T20:14:30.650 に答える
0

コンセプト

私にとって最善の解決策は、PubNub API の s を、 XChange ライブラリJSONObjectの MtGox モジュールで見つけた Bean クラスに変換することでした。

確かに、この回答の最後にあるように、このアプローチではかなりの量のグルー コードが追加されますが、変換後はコードがはるかに単純になるため、苦労する価値があると思います。たとえば、BTC が最後に取引されたティッカーからレートと通貨を取得するには、単純に次のように記述します。

ticker.getLast().getValue()

ticker.getLast().getCurrency()

どうやってするの

XChange ライブラリのmtgox モジュールは maven アーティファクト として提供されており、非常に便利です。このモジュールを依存関係としてプロジェクトに追加するだけで、プロジェクトのセットアップは完了です。

xchange-mtgox モジュールには、2 つのcalssesMtGoxTradeMtGoxTicker.

JSONObjectJackson を使用すると、これらのクラスの 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 に効率的にマップする方法についての質問への回答に従うことで回避できます。

于 2013-12-24T00:37:40.637 に答える