使用 Retrofit 解析动态键 Json 字符串
Parse Dynamic Key Json String using Retrofit
我正在尝试解析以下动态键 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
class 正在添加您的 JSON 中不存在的额外对象层。尝试将地图移动到您的 Data
class 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<>();
}
}
-----------------------------
然后,像这样创建一个解析器 class:
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 中输入此内容 class
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();
我希望这会对某人有所帮助
我正在尝试解析以下动态键 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
class 正在添加您的 JSON 中不存在的额外对象层。尝试将地图移动到您的 Data
class 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<>();
}
}
-----------------------------
然后,像这样创建一个解析器 class:
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 中输入此内容 class
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();
我希望这会对某人有所帮助