Android 使用改型解析动态键Json字符串

Android 使用改型解析动态键Json字符串,android,json,retrofit,Android,Json,Retrofit,我试图解析以下动态键Json字符串 "report":{ "data":{ "results":{ "558952cca6d73d7d81c2eb9d":{ "Max":-1, "Min":-1, "Slope":-1, }, "558ce148a6d73d7d81c2fa8a":{

我试图解析以下动态键Json字符串

"report":{
    "data":{
        "results":{
            "558952cca6d73d7d81c2eb9d":{
                "Max":-1,
                "Min":-1,
                "Slope":-1,
            },

            "558ce148a6d73d7d81c2fa8a":{
                "Max":-2,
                "Min":-1,
                "Slope":-2,
            }
        }
    }
}
 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;
        }
    }
下面我尝试获取数据,但在解析最后一个动态json字符串时出错

"report":{
    "data":{
        "results":{
            "558952cca6d73d7d81c2eb9d":{
                "Max":-1,
                "Min":-1,
                "Slope":-1,
            },

            "558ce148a6d73d7d81c2fa8a":{
                "Max":-2,
                "Min":-1,
                "Slope":-2,
            }
        }
    }
}
 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;
        }
    }
公共类报告{
@SerializedName(“数据”)
@暴露
私人数据;
公共数据getData(){
返回数据;
}
公共无效设置数据(数据){
这个数据=数据;
}
@凌驾
公共字符串toString(){
返回“报告{”+
“数据=”+数据+
'}';
}
}
公共类数据{
@SerializedName(“结果”)
@暴露
私人结果附带结果;
public ResultInside getResult(){
返回结果;
}
公共void setResult(ResultInside结果){
this.result=结果;
}
}
公共类ResultInside{
/*@SerializedName(“结果”)
@暴露*/
私有映射elemDetails=newhashmap();
公共地图getElemDetails(){
返回元素细节;
}
公共无效集合元素详细信息(地图元素详细信息){
this.elemDetails=elemDetails;
}
}

任何关于如何在这种情况下解析的建议

您的
resultInside
类正在添加JSON中不存在的额外对象层。尝试将地图移动到
数据
结果
字段

public class Data {
    @SerializedName("results")
    @Expose
    private Map<String, Vitals> result;

    //....
}
公共类数据{
@SerializedName(“结果”)
@暴露
私有地图结果;
//....
}

更好的方法是:

----------------------

public class Report {
        @SerializedName("data")
        @Expose
        private Data data;

----------------------

public class Data {


    public HashMap<String, DataValues> dataValues;


    public Data() {
        this.dataVaues = new HashMap<>();
    }
}

-----------------------------

我希望这能帮助别人

你好!你找到解决办法了吗?我也有同样的问题。@genkakasysan Check接受了下面的答案。@Shubh Hai,我也有同样的问题,我不知道如何为动态键添加Pojo类,你能告诉我你在Vitals类中使用了什么吗?@MathaN Check使用json字符串和受尊重的数据类。报告->数据->结果->生命体征。所以必须包含max,min,slope作为变量。我犯了一个错误,在Result中创建了另一个ResultInside类,它将运行时键映射到Vitals类,但事实并非如此。检查下面的已接受答案,以创建ResultInsid并处理其结果类本身。在改型过程中,如果要使用动态键(使用动态名称)解析JSON,则需要确保使用HashMap。所以这个答案是我的正确答案。只需确保将HashMap放在具有静态名称(而不是动态名称)的对象级别,非常感谢。您节省了我的时间:)如果每个动态键的子项之一是JSONObject的JSONArray,如何处理(从中接收数据)。谢谢你能解释一下为什么这样做吗?看起来GSON正在跳过动态命名的密钥,但我不明白为什么。