我试图解析动态密钥Json String。
"report":{
"data":{
"results":{
"558952cca6d73d7d81c2eb9d":{
"Max":-1,
"Min":-1,
"Slope":-1,
},
"558ce148a6d73d7d81c2fa8a":{
"Max":-2,
"Min":-1,
"Slope":-2,
}
}
}
}
我试图获取数据,但在解析上一个动态json String时出错。
public class Report {
@SerializedName("data")
@Expose
private Data data;
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
@Override
public String toString() {
return "Report{" +
"data=" + data +
'}';
}
}
public class Data {
@SerializedName("results")
@Expose
private ResultInside result;
public ResultInside getResult() {
return result;
}
public void setResult(ResultInside result) {
this.result = result;
}
}
public class ResultInside {
/*@SerializedName("results")
@Expose*/
private Map<String, Vitals> elemDetails = new HashMap<>();
public Map<String, Vitals> getElemDetails() {
return elemDetails;
}
public void setElemDetails(Map<String, Vitals> elemDetails) {
this.elemDetails = elemDetails;
}
}
在这种情况下有任何建议如何解析!
答案 0 :(得分:41)
您的resultInside
类正在添加JSON中不存在的额外对象层。尝试将地图移至Data
班results
字段。
public class Data {
@SerializedName("results")
@Expose
private Map<String, Vitals> result;
//....
}
答案 1 :(得分:6)
更好的方法是:
----------------------
public class Report {
@SerializedName("data")
@Expose
private Data data;
----------------------
public class Data {
public HashMap<String, DataValues> dataValues;
public Data() {
this.dataVaues = new HashMap<>();
}
}
-----------------------------
然后,创建一个像这样的Parser类:
public class DataParser implements JsonDeserializer<Data> {
@Override
public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Data result = new Data();
try {
final HashMap<String, DataValues> map = readServiceUrlMap(json.getAsJsonObject());
if(map != null) {
result.dataValues = map;
}
}catch (JsonSyntaxException ex){
return null;
}
return result;
}
private HashMap<String, DataValues> readServiceUrlMap(final JsonObject jsonObject) throws JsonSyntaxException {
if(jsonObject == null) {
return null;
}
Gson gson = new Gson();
HashMap<String, DataValues> products = new HashMap<>();
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
String key = entry.getKey();
DataValues value = gson.fromJson(entry.getValue(), DataValues.class);
products.put(key, value);
}
return products;
}
----------------------------------------------
之后,在ApiClient类中输入
public class ApiClient {
private static Retrofit retrofit = null;
public static Retrofit getClient(String baseUrl) {
if(retrofit == null) {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Data.class, new DataParser());
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(gsonBuilder.create()))
.build();
我希望这能帮到某人