次の動的キーJson文字列を解析しようとしています。
"report":{
"data":{
"results":{
"558952cca6d73d7d81c2eb9d":{
"Max":-1,
"Min":-1,
"Slope":-1,
},
"558ce148a6d73d7d81c2fa8a":{
"Max":-2,
"Min":-1,
"Slope":-2,
}
}
}
}
以下はデータを取得しようとしていますが、最後の動的json文字列の解析中にエラーが発生します。
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;
}
}
この場合の解析方法の提案!
resultInside
クラスは、JSONに存在しないオブジェクトレイヤーを追加しています。マップをData
クラスresults
フィールドに移動してみてください。
public class Data {
@SerializedName("results")
@Expose
private Map<String, Vitals> result;
//....
}
これを行うより良い方法は、次のとおりです。
----------------------
public class Report {
@SerializedName("data")
@Expose
private Data data;
----------------------
public class Data {
public HashMap<String, DataValues> dataValues;
public Data() {
this.dataVaues = new HashMap<>();
}
}
-----------------------------
次に、次のようなパーサークラスを作成します。
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();
これが誰かを助けることを願っています