0

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

检索数据时,API 以 a 的形式传递数据,JSONObject表示 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 类

很容易创建一个现成的 Java 类来摄取 Mt.Gox 提供的实时提要!

官方比特币维基 JSON 流媒体 API

我们将根据比特币官方 Wiki 提供的比特币 wiki 提要说明进行工作:https ://en.bitcoin.it/wiki/MtGox/API/Pubnub - 继续阅读下面的屏幕截图以继续。

PubNub 开发者控制台

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

  1. 实时 Feed 交易活动(买/卖 Feed):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

这个概念

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

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

ticker.getLast().getValue()

ticker.getLast().getCurrency()

怎么做

XChange 库的mtgox 模块作为 maven artifact 提供,非常方便。您只需将此模块作为依赖项添加到您的项目中,项目设置就完成了。

在 xchange-mtgox 模块中,您将找到com.xeiam.xchange.mtgox.v2.dto.marketdata包,其中包含两个类MtGoxTradeMtGoxTicker.

JSONObject使用 Jackson 可以轻松地从这些课程转换为其中一个课程ObjectMapper。作为一个优势,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)。

此外,请注意,此代码中存在性能损失,可以通过遵循问题 如何有效地将 org.json.JSONObject 映射到 POJO?

于 2013-12-24T00:37:40.637 回答