Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用Gson将JSON对象解析为未知类型的映射_Android_Json_Gson_Retrofit - Fatal编程技术网

Android 如何使用Gson将JSON对象解析为未知类型的映射

Android 如何使用Gson将JSON对象解析为未知类型的映射,android,json,gson,retrofit,Android,Json,Gson,Retrofit,我开始使用Gson进行改造,而不是Jackson,来解析Wikipedia API中的一些Json,其结构如下: { "batchcomplete": "", "query": { "pages": { "21721040": { "pageid": 21721040, "ns": 0, "title": "Stack Overflow", "extract": "Stack Overflow 在“pa

我开始使用Gson进行改造,而不是Jackson,来解析Wikipedia API中的一些Json,其结构如下:

{
  "batchcomplete": "",
  "query": {
    "pages": {
      "21721040": {
        "pageid": 21721040,
        "ns": 0,
        "title": "Stack Overflow",
        "extract": "Stack Overflow
在“pages”对象中,我试图将下一个块映射到键/值类型为String和WikiSummary的map对象,但该对象返回null。通过Jackson,如果我没记错的话,你可以像这样直接映射,因为我不知道“页面”中的对象值

WikiPages.class

public class WikiPages {

    public Map<String, WikiSummary> summaryMap;

    public WikiPages(Map<String, WikiSummary> summaryMap) {
        this.summaryMap = summaryMap;
    }

    public Map<String, WikiSummary> getSummaryMap() {
        return summaryMap;
    }

    public void setSummaryMap(Map<String, WikiSummary> summaryMap) {
        this.summaryMap = summaryMap;
    }

}
JSONObject pagesObject=queryObject.getJSONObject(“页面”);
Set keys=pagesObject.keySet();
用于(字符串k:键){
JSONObject desiredKeyValues=elements.getJSONObject(k);
}
JSONObject pagesObject=queryObject.getJSONObject(“页面”);
Set keys=pagesObject.keySet();
用于(字符串k:键){
JSONObject desiredKeyValues=elements.getJSONObject(k);
}

您似乎不需要
WikiPages
,因为它本身必须是一个映射(对于最简单的Gson配置,否则需要更复杂的反序列化程序)。因此,Gson正在寻找给定JSON中不存在的
summaryMap
属性,这就是为什么它是
null
。下面的映射

final class WikiResponse {
    @SerializedName("batchcomplete")
    final String batchComplete = null;
    @SerializedName("query")
    final WikiQuery query = null; // this is what you seem to be looking for
}

final class WikiQuery {
    @SerializedName("pages")
    final Map<String, WikiSummary> pages = null;
}

final class WikiSummary {
    @SerializedName("pageid")
    final int pageId = Integer.valueOf(0); // can't be null, but a simple `0` literal will be inlined
    @SerializedName("title")
    final String title = null;
    @SerializedName("extract")
    final String extract = null;
}
final类WikiResponse{
@SerializedName(“batchcomplete”)
最终字符串batchComplete=null;
@SerializedName(“查询”)
final WikiQuery query=null;//这就是您要查找的内容
}
最终类WikiQuery{
@序列化名称(“页面”)
最终地图页=空;
}
期末课程总结{
@SerializedName(“页面ID”)
final int pageId=Integer.valueOf(0);//不能为null,但将内联一个简单的'0'文本
@序列化名称(“标题”)
最终字符串标题=null;
@序列化名称(“摘录”)
最终字符串提取=null;
}

可以表示JSON(假设上面的DTO是传入的,而不是设计为传出的[否则会增强];Gson可以为最终字段分配实际值)。解析给定的JSON并使用
wikiResponse.query.pages.get(“21721040”).title
查询反序列化的POJO将导致
堆栈溢出
您似乎不需要
WikiPages
,因为它本身必须是一个映射(对于最简单的Gson配置,否则需要更复杂的反序列化器)。因此,Gson正在寻找给定JSON中不存在的
summaryMap
属性,这就是为什么它是
null
。下面的映射

final class WikiResponse {
    @SerializedName("batchcomplete")
    final String batchComplete = null;
    @SerializedName("query")
    final WikiQuery query = null; // this is what you seem to be looking for
}

final class WikiQuery {
    @SerializedName("pages")
    final Map<String, WikiSummary> pages = null;
}

final class WikiSummary {
    @SerializedName("pageid")
    final int pageId = Integer.valueOf(0); // can't be null, but a simple `0` literal will be inlined
    @SerializedName("title")
    final String title = null;
    @SerializedName("extract")
    final String extract = null;
}
final类WikiResponse{
@SerializedName(“batchcomplete”)
最终字符串batchComplete=null;
@SerializedName(“查询”)
final WikiQuery query=null;//这就是您要查找的内容
}
最终类WikiQuery{
@序列化名称(“页面”)
最终地图页=空;
}
期末课程总结{
@SerializedName(“页面ID”)
final int pageId=Integer.valueOf(0);//不能为null,但将内联一个简单的'0'文本
@序列化名称(“标题”)
最终字符串标题=null;
@序列化名称(“摘录”)
最终字符串提取=null;
}

可以表示JSON(假设上面的DTO是传入的,而不是设计为传出的[否则会增强];Gson可以为最终字段分配实际值)。解析给定的JSON并使用
wikiResponse.query.pages.get(“21721040”).title查询反序列化的POJO将导致
堆栈溢出

请在回答中添加一些详细信息?谢谢你能在回答中添加一些细节吗?感谢您的json属性是动态的,最简单的解决方案是将页面设置为HashMap。由于json属性是动态的,所以最简单的解决方案是将页面设置为HashMap。Gson可以很好地解析它。太棒了!成功了。我想用我的WikiSummary内容制作一张地图,而不是“页面”对象。太棒了!成功了。我想用我的WikiSummary内容制作一张地图,而不是“pages”对象。
final class WikiResponse {
    @SerializedName("batchcomplete")
    final String batchComplete = null;
    @SerializedName("query")
    final WikiQuery query = null; // this is what you seem to be looking for
}

final class WikiQuery {
    @SerializedName("pages")
    final Map<String, WikiSummary> pages = null;
}

final class WikiSummary {
    @SerializedName("pageid")
    final int pageId = Integer.valueOf(0); // can't be null, but a simple `0` literal will be inlined
    @SerializedName("title")
    final String title = null;
    @SerializedName("extract")
    final String extract = null;
}