gpt4 book ai didi

java - 使用相同变量序列化具有不同数据类型的 JSON

转载 作者:行者123 更新时间:2023-11-29 04:43:22 25 4
gpt4 key购买 nike

我正在试用 Opensignal API,但在尝试使用 Jackson 2.0 序列化结果时遇到了障碍。 networkRank可以是数组也可以是字符串

我如何设置 Jackson 以正确序列化 JSON,比如如果它是一个字符串,将它保存到这个 String networkRank属性否则保存到List <NetworkRank> = new ArrayList<NetworkRank>()

这些是他们的 api 的结果:(查看下面的 networkRank)

{
"apiVersion": "2",
"latitude": "14.55669",
"longitude": "121.370119",
"distance": "10",
"network_type": "10",
"perMinuteCurrent": 0,
"perMinuteLimit": 10,
"perMonthCurrent": 7,
"perMonthLimit": 2000,
"networkRank": "No results for this area"
}

{
"apiVersion": "2",
"latitude": "14.55669",
"longitude": "121.370119",
"distance": "10",
"network_type": "10",
"perMinuteCurrent": 0,
"perMinuteLimit": 10,
"perMonthCurrent": 7,
"perMonthLimit": 2000,
"networkRank": [
{
"networkName": "T-Mobile",
"networkId": "310260",
"type3G": {
"networkName": "T-Mobile",
"networkId": "310260",
"networkType": "3",
"averageRssiAsu": "10.934899",
"averageRssiDb": "-91.130203",
"sampleSizeRSSI": "437532",
"downloadSpeed": "4532.8305",
"uploadSpeed": "1124.9649",
"pingTime": "148.8205",
"reliability": "94.5944170771741"
},
"type4G": {
"networkName": "EE",
"networkId": "23430",
"networkType": "4",
"averageRsrpAsu": "33.865632",
"averageRsrpDb": "-106.134368",
"sampleSizeRSRP": "284041",
"downloadSpeed": "9851.1000",
"uploadSpeed": "4377.3200",
"pingTime": "87.0000",
"reliability": "96.2113095238094"
}
}
]
}

最佳答案

对 json 字符串或数组使用相同字段的最简单方法可能是使用 Object 字段。此解决方案不需要自定义序列化器和反序列化器。以下是带有 Jackson 注释的示例类:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class NetworkStatistics {

private String apiVersion;
private String latitude;
private String longitude;
private String distance;
@JsonProperty("network_type")
private String networkType;
private int perMinuteCurrent;
private int perMinuteLimit;
private int perMonthCurrent;
private int perMonthLimit;
private Object networkRank;

public NetworkStatistics() {
}

// getters
}

以下是将 api 响应的 json 字符串反序列化为 NetworkStatistics 实例的示例:

ObjectMapper mapper = new ObjectMapper();
NetworkStatistics networkStatistics = mapper.readValue(json, NetworkStatistics.class);

以及将 NetworkStatistics 实例序列化为 json 字符串的示例:

String json = mapper.writeValueAsString(networkStatistics))

如果json中的networkRank是一个字符串值,那么反序列化后的实例字段就是一个String字段。如果它是一个 json 数组,实例字段将是一个 java.util.ArrayList 字段。

希望对您有所帮助。

关于java - 使用相同变量序列化具有不同数据类型的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38305442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com