首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MtGox/PubNub JSON API中提取数据的方便方法?

从MtGox/PubNub JSON API中提取数据的方便方法?
EN

Stack Overflow用户
提问于 2013-12-12 15:43:09
回答 2查看 744关注 0票数 0

我使用Java和PubNub从MtGox中提取数据。

当检索数据时,API以JSONObject的形式传递数据,表示JSON数据的树结构。试图直接从JSONObject中提取一些信息会产生大量调用getJSONObject(String)的丑陋代码,对于这些代码,可能再次需要处理异常。

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

代码语言:javascript
复制
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中的信息

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-12 20:14:30

用于PubNub JSON的MtGox Java类

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

官方比特币Wiki JSON流API

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

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

  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文档

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

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

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

代码语言:javascript
复制
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) {}

            }});
    }
}

请参阅MtGox源代码的完整示例- https://github.com/pubnub/mtgox/blob/master/java/examples/PubnubMtGoxSample.java

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

代码语言:javascript
复制
javac -cp Pubnub-MtGox.jar:libs/json-20090211.jar   examples/PubnubMtGoxSample.java

然后跑:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2013-12-24 00:37:40

概念

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

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

代码语言:javascript
复制
ticker.getLast().getValue()

代码语言:javascript
复制
ticker.getLast().getCurrency()

如何做

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

在xchange模块中,您会发现包com.xeiam.xchange.mtgox.v2.dto.marketdata包含两个calsses MtGoxTradeMtGoxTicker

JSONObject转换到这些类中的一个很容易使用杰克逊ObjectMapper。作为一个优点,杰克逊图书馆自动作为xchange工件的传递依赖项导入。这意味着,如果使用maven,甚至不必编写一行代码就可以将其添加到项目中。

下面是一个完整的可运行示例。大多数是使用PubNub的标准代码。重要的位在标记// BEGIN OF IMPORTANT PART// END OF IMPORTANT PART之间。

代码语言:javascript
复制
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?的答案来避免

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20547815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档