我的应用程序正在从WebSocket连接接收JSON消息。
有不同类型的答案,其格式如下:
{
"type": "snapshot",
"product_id": "BTC-EUR",
"bids": [["1", "2"]],
"asks": [["2", "3"]]
}
或
{
"type": "l2update",
"product_id": "BTC-EUR",
"changes": [
["buy", "1", "3"],
["sell", "3", "1"],
["sell", "2", "2"],
["sell", "4", "0"]
]
}
...例如(请参阅完整的API here)。
根据“类型”,我希望GSON映射另一个类(例如Snapshot.class和l2update.class)。
我有订阅WebSocket连接的消息处理程序,我希望消息由相关的处理程序处理。例如:
我的问题是根据类型分发邮件。
我正在考虑将它们转换为适当的类,然后使用工厂调用相关的处理程序。我目前停留在第一步,根据“类型”转换Error.class或Snapshot.class中的JSON。
我该怎么做?
答案 0 :(得分:1)
您可能需要考虑使用需要少一点实体对象模型的库,至少在开始时是这样。我使用JsonPath来做这类事情。您可以使用它来至少找出您正在处理的type
:
String type = JsonPath.read(yourIncomingJson, "$.type");
然后,根据字符串,执行@ShafinMahmud建议的switch语句。
但是,您也可以使用JsonPath。您可以使用路径表示法读取所有值,并知道如何根据类型进行解析。
添加另一个库来读取单个值可能适用于您,也可能不适用,但如果您使用它来读取其他值,则可能最终值得。
答案 1 :(得分:1)
对于Gson,您可以使用com.google.gson.typeadapters.RuntimeTypeAdapterFactory
。
假设你有 - 例如 - 下面的课程:
public class BaseResponse {
private String type, product_id;
// rest of the common fields
}
public class Snapshot extends BaseResponse {
// rest of the fields
}
public class L2Update extends BaseResponse {
// rest of the fields
}
然后你将构建以下RuntimeTypeAdapterFactory
:
RuntimeTypeAdapterFactory<BaseResponse> runtimeTypeAdapterFactory =
RuntimeTypeAdapterFactory
.of(BaseResponse.class, "type") // set the field where to look for value
.registerSubtype(L2Update.class, "l2update") // values map to 'type'
.registerSubtype(Snapshot.class, "snapshot");// value in json
将此注册到Gson将启用每种响应的自动化实例化:
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(runtimeTypeAdapterFactory).create();
如果使用BaseResponse
,请提供fromJson(..)
,例如:
gson.fromJson( json , BaseResponse.class);
注意:Gson省略了&amp; amp;序列化type
字段。但是它需要在Json中设置。就像你现在回答的那样。