Gson 解析动态 json 键

Gson Parsing with dynamic json keys

我浏览了很多关于动态键解析的帖子。但是在使用 Gson 解析 JSON 格式时仍然感到困惑,这是我现有项目中的新响应。

{
    "position":0,
    “source”:[“Win","Web","Capture","iOS","Camera","Back"],
    “source_data”:{
        "Web”:{“years”:[{“start”:1500,"end”:1700}]},
        "Win":{"years":[{"start”:1700,"end”:2000}]},
        "iOS":{"years":[{"start”:1700,"end”:2200}]},
        "Back":{"years":[{"start”:2100,"end”:2300}]},               
        "Camera":{"years":[{"start”:2200,"end":2200},{"start”:2200,"end”:2600},{"start”:2300,"end”:2600}]},
        "Capture":{"years":[{"start”:1700,"end”:2100}]}
    }
}

我已经 Json 使用 Gson 库进行解析设置。 下面是我用来解析的代码片段。但是 source_data 键的值没有存储到我的模型中 class

@Expose
@SerializedName("source_data")
private SourceData mSourceData;


public class SourceData {

    HashMap<String, SourceYears> mSourceYears;

    public HashMap<String, SourceYears> getSourceYears() {
        return mSourceYears;
    }

    public void setSourceYears(HashMap<String, SourceYears> years) {
        this.mSourceYears = years;
    }
}

public class SourceYears {
    @Expose
    @SerializedName("years")
    private List<Years> mYears;

    public List<Years> getYears() {
        return mYears;
    }

    public void setYears(List<Years> years) {
        this.mYears = years;
    }
}

此处 Years 是包含 startend 键的 class。

如果有人发现我做错了什么,请提出建议。

请尝试使用这个,我已经根据您提供的 json 改进了模型,并且由于双引号错误,您提供的 json 不准确。

这是我的 Pojo 类

class YearWrapper {
        List<YearObject> years;

        public List<YearObject> getYears() {
            return years;
        }

        public void setYears(List<YearObject> years) {
            this.years = years;
        }

        @Override
        public String toString() {
            return "YearWrapper{" +
                    "years=" + years +
                    '}';
        }
    }

    class YearObject {
        int start;
        int end;

        public int getStart() {
            return start;
        }

        public void setStart(int start) {
            this.start = start;
        }

        public int getEnd() {
            return end;
        }

        public void setEnd(int end) {
            this.end = end;
        }

        @Override
        public String toString() {
            return "YearObject{" +
                    "start=" + start +
                    ", end=" + end +
                    '}';
        }
    }

    class KeyValueMapModel {
        int position;
        List<String> source;
        @SerializedName("source_data")
        Map<String, YearObject> sourceData;

        public int getPosition() {
            return position;
        }

        public void setPosition(int position) {
            this.position = position;
        }

        public List<String> getSource() {
            return source;
        }

        public void setSource(List<String> source) {
            this.source = source;
        }

        public Map<String, YearObject> getSourceData() {
            return sourceData;
        }

        public void setSourceData(Map<String, YearObject> sourceData) {
            this.sourceData = sourceData;
        }

        @Override
        public String toString() {
            return "KeyValueMapModel{" +
                    "position=" + position +
                    ", source=" + source +
                    ", sourceData=" + sourceData +
                    '}';
        }
    }

这是我调用它的方式:

Gson gson = new Gson();
KeyValueMapModel keyValueMapModel = gson.fromJson(yourJsonString, KeyValueMapModel.class);
System.out.println(keyValueMapModel);