【问题标题】:Convenient way to extract data from the MtGox/PubNub JSON API?从 MtGox/PubNub JSON API 提取数据的便捷方式?
【发布时间】:2013-12-12 15:43:09
【问题描述】:

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

在检索数据时,API 以JSONObject 的形式传递数据,它表示 JSON 数据的树形结构。尝试直接从JSONObject 中提取信息位会产生丑陋的代码,其中包含对getJSONObject(String) 的大量调用,因此可能需要再次处理异常。

因此,我正在寻找一种从JSONObject 响应中提取信息的便捷方法。到目前为止,我遇到了将JSONObject 转换为 POJO 然后访问 POJO 的可能性。对于转换,我从 Jackson 库中找到了 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中存储的信息?

【问题讨论】:

  • 您可以使用raw binding。但即便如此,编写 POJO 也不是什么大事,它会简化你必须编写的所有其他代码。

标签: java json pubnub mtgox


【解决方案1】:

MtGox JSON API 的 PubNub Java 类

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

官方比特币维基 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 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

【讨论】:

    【解决方案2】:

    概念

    对我来说,最好的解决方案是将 PubNub API 中的 JSONObjects 转换为我在 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 模块中,您会发现包 com.xeiam.xchange.mtgox.v2.dto.marketdata 带有两个名称 MtGoxTradeMtGoxTicker

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

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

    【讨论】:

    • 您能否将此问题标记为“已回答”,或者如果我们可以提供更多详细信息,请告诉我们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多