使用不同的类来使用GSON映射JSON数据

时间:2018-02-19 16:32:25

标签: java json gson

我的应用程序正在从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连接的消息处理程序,我希望消息由相关的处理程序处理。例如:

  • ErrorMessageHandler将管理错误
  • SnapshotMessageHandler会创建初始订单簿
  • L2UpdateMessageHandler会更新订单簿

我的问题是根据类型分发邮件。

我正在考虑将它们转换为适当的类,然后使用工厂调用相关的处理程序。我目前停留在第一步,根据“类型”转换Error.class或Snapshot.class中的JSON。

我该怎么做?

2 个答案:

答案 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中设置。就像你现在回答的那样。