我使用Java和PubNub从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中的信息
发布于 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 --继续阅读下面的截图以继续。

要查看我们将使用的实时数据提要,请查看以下两个链接:
PubNub Java文档
我们将使用PubNub Java文档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) {}
}});
}
}请参阅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-24 00:37:40
概念
对我来说,最好的解决方案是将JSONObject从PubNub API转换为bean类,这是我在XChange库的MtGox模块中找到的。
承认,这种方法增加了相当多的胶水代码,正如您在这个答案的末尾所看到的,但是我认为这是值得的,因为在转换之后,代码变得更简单了。例如,为了从BTC上一次交易的代码中获取汇率和货币,您可以简单地写
ticker.getLast().getValue()和
ticker.getLast().getCurrency()如何做
XChange库的mtgox模块可以作为maven工件使用。,非常方便。您只需要将此模块作为依赖项添加到项目中,项目设置就完成了。
在xchange模块中,您会发现包com.xeiam.xchange.mtgox.v2.dto.marketdata包含两个calsses MtGoxTrade和MtGoxTicker。
从JSONObject转换到这些类中的一个很容易使用杰克逊ObjectMapper。作为一个优点,杰克逊图书馆自动作为xchange工件的传递依赖项导入。这意味着,如果使用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?的答案来避免
https://stackoverflow.com/questions/20547815
复制相似问题