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

时间:2013-12-12 15:43:10

标签: java json pubnub mtgox

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

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

因此,我正在寻找一种从JSONObject响应中提取信息的便捷方法。到目前为止,我已经想到了将JSONObject转换为POJO然后访问POJO的可能性。对于转换,我找到了杰克逊图书馆的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

中的信息

2 个答案:

答案 0 :(得分:3)

适用于MtGox JSON API的PubNub Java类

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

官方比特币Wiki JSON Streaming API

我们将使用比特币官方Wiki提供的比特币wiki提要指令:https://en.bitcoin.it/wiki/MtGox/API/Pubnub - 继续阅读屏幕截图下方的内容。

PubNub Developer Console

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

  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. 直播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=true
  3. 贸易滞后示例:https://www.mtgox.com/lag.html
  4. PubNub Java SDK Docs

    我们将使用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
    

答案 1 :(得分:0)

概念

对我来说,最好的解决方案是将JSONObject从PubNub API转换为我在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模块中,您会找到包含两个calsses MtGoxTradeMtGoxTicker的包com.xeiam.xchange.mtgox.v2.dto.marketdata

杰克逊JSONObject很容易从ObjectMapper转换为其中一个类。作为优势,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)。

Morevoer,请注意此代码中存在性能损失,可以通过回答问题来避免 How to efficiently map a org.json.JSONObject to a POJO?