Java 无法使用GSON将复杂json序列化到对象?
下面是我从服务API调用得到的JSON字符串。为了便于理解,我将其缩短为只有三个Java 无法使用GSON将复杂json序列化到对象?,java,json,serialization,gson,Java,Json,Serialization,Gson,下面是我从服务API调用得到的JSON字符串。为了便于理解,我将其缩短为只有三个reportRecords。一般来说,它可能有约500条reportRecords { "aggRecords": { "reportRecords": [ { "min": 0, "max": 12, "avg": 0.3699187, "count": 246,
reportRecords
。一般来说,它可能有约500条reportRecords
{
"aggRecords": {
"reportRecords": [
{
"min": 0,
"max": 12,
"avg": 0.3699187,
"count": 246,
"sumSq": 571,
"stddev": 1.4779372,
"median": 0,
"percentileMap": {
"95": 4
},
"metricName": "TransactionDuration",
"dimensions": {
"env": "dev",
"pool": "titan",
"Name": "PostProcessing",
"Type": "PostProcessing"
},
"value": 91
},
{
"min": 0,
"max": 23,
"avg": 2.3991289E-4,
"count": 1463031,
"sumSq": 3071,
"stddev": 0.045814946,
"median": 0,
"percentileMap": {
"95": 0
},
"metricName": "TransactionDuration",
"dimensions": {
"env": "dev",
"pool": "titan",
"Name": "ResourceContext",
"Type": "ResourceContext"
},
"value": 351
},
{
"min": 0,
"max": 1209,
"avg": 1.9203402,
"count": 7344636,
"sumSq": 71832774,
"stddev": 2.4683187,
"median": 2,
"percentileMap": {
"95": 4
},
"metricName": "TransactionDuration",
"dimensions": {
"env": "dev",
"pool": "titan",
"Name": "Client::Sync",
"Type": "Client::Sync"
},
"value": 14104200
}
]
},
"minRecordsMap": {}
}
现在,从上面的JSON响应中,我需要提取reportRecords
,它的Name
是Client::Sync
。也就是说,我只需要从上面的JSON响应中提取下面的reportRecords
{
"min": 0,
"max": 1209,
"avg": 1.9203402,
"count": 7344636,
"sumSq": 71832774,
"stddev": 2.4683187,
"median": 2,
"percentileMap": {
"95": 4
},
"metricName": "TransactionDuration",
"dimensions": {
"env": "dev",
"pool": "titan",
"Name": "Client::Sync",
"Type": "Client::Sync"
},
"value": 14104200
}
现在我需要为Client::Sync
将上面的reportRecords
解析到下面的对象-
public class DataMetrics {
private String pool;
private String name;
private String type;
private String env;
private String metricName;
private String percentile;
private String median;
private String stdDev;
private String sumSq;
private String count;
private String avg;
private String max;
private String min;
// getters and setters here
}
所以序列化之后,上面的对象应该是这样的-
pool is titan
name is Client::Sync
type is Client::Sync
env is dev
metricNname is TransactionDuration
95th percentile is 4
median is 2
stdDev is 2.4683187
sumSq is 71832774
count is 7344636
avg is 1.9203402
max is 1209
min is 0
我在这里使用GSON库,下面是我迄今为止尝试过的-
private static RestTemplate restTemplate = new RestTemplate();
public static void main(String[] args) {
String jsonLine = restTemplate.getForObject("some_url", String.class);
System.out.println(jsonLine); // here jsonLine will give me above big JSON String
JsonElement jelement = new JsonParser().parse(jsonLine);
JsonObject jobject = jelement.getAsJsonObject();
jobject = jobject.getAsJsonObject("aggRecords");
JsonArray jarray = jobject.getAsJsonArray("reportRecords");
Type type = new TypeToken<List<DataMetrics>>() {}.getType();
List<DataMetrics> records = gson.fromJson(jsonArrayThatYouHave, type);
List<DataMetrics> result = new LinkedList<>();
for(DataMetrics record : records){
if(record.name.equals("Client::Sync")){
result.add(record);
}
}
}
私有静态RestTemplate RestTemplate=新RestTemplate();
公共静态void main(字符串[]args){
String jsonLine=restemplate.getForObject(“某个url”,String.class);
System.out.println(jsonLine);//这里jsonLine将给出上面的大JSON字符串
JsonElement-jelement=new-JsonParser().parse(jsonLine);
JsonObject jobject=jeelement.getAsJsonObject();
jobject=jobject.getAsJsonObject(“aggRecords”);
JsonArray jarray=jobject.getAsJsonArray(“报告记录”);
Type Type=new-TypeToken(){}.getType();
List records=gson.fromJson(jsonArrayThatYouHave,type);
列表结果=新建LinkedList();
对于(DataMetrics记录:记录){
if(record.name.equals(“Client::Sync”)){
结果.添加(记录);
}
}
}
但出于某种原因,DataMetrics中的某些字段向我显示数据,但某些字段变为空,这使我认为我的上述代码中有错误,或者我的DataMetrics类不正确?通常,对于嵌套对象,如
维度
,您将为其声明另一个POJO
class DataMetrics{
private String min;
private String max;
private String avg;
/*Insert other members*/
private Dimensions dimensions;
public boolean isClientSync(){
return "Client::Sync".equals(dimensions.Name);
}
private class Dimensions{
private String env;
private String pool;
private String Name;
}
}
测试:
public void test() {
String json = "[{\"min\": 0,\"max\": 1209,\"avg\": 1.9203402,\"count\": 7344636,\"sumSq\": 71832774, \"stddev\": 2.4683187, \"median\": 2,\"percentileMap\": {\"95\": 4},\"metricName\": \"TransactionDuration\",\"dimensions\": {\"env\": \"dev\",\"pool\": \"titan\",\"Name\": \"Client::Sync\", \"Type\": \"Client::Sync\"},\"value\": 14104200}]";
final Gson gson = new Gson();
final Type type = new TypeToken<List<DataMetrics>>() {}.getType();
final List<DataMetrics> records = gson.fromJson(json, type);
Assert.assertTrue(records.get(0).isClientSync());
}
还请注意,成员变量名称应与JSON属性名称完全匹配
=>stdDev
stdDev
=>名称
名称
=>percentile
percentileMap
private Map<String, Integer> percentileMap;