我正在使用带有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
?
答案 0 :(得分:3)
很容易创建一个现成的Java类来摄取Mt.Gox提供的实时源这是一篇正在进行中的文章,向您展示如何从开发中显示如何从Mt.Gox访问PubNub数据源控制台直播!
我们将使用比特币官方Wiki提供的比特币wiki提要指令:https://en.bitcoin.it/wiki/MtGox/API/Pubnub - 继续阅读屏幕截图下方的内容。
要查看我们将使用的实时实时数据Feed,请查看以下两个链接:
我们将使用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 MtGoxTrade
和MtGoxTicker
的包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?