使用Gson映射混合类型对象

时间:2016-02-25 15:16:11

标签: java android json gson

我正在尝试使用json feed创建数据模型。如何在对象中映射混合类型的对象?

base_data对象的pager Map<String,String>resultList<Map<String,String>。是否可以创建另一个类BaseData来映射对象并导回到模型类?例如:

public class Model{

   private Map <String,BaseData> base_data;
}

但是我在getBaseData()

中收到混合匹配错误

整个代码:

Json对象:

{
  "id": "2",
  "type":"book",
  "base_data": {
    "result": [
      {
        "retailer": "Amazon",
        "price": "$50"
      },
      {
        "retailer": "Target",
        "price": "$60"
      }
    ],
    "pager": {
      "current_page": "5",
      "link": "www.somesite.com"
    }
  }
}

模型类

import com.BaseData;

public class Model{

    private String id;

    private String type;

    private Map <String,BaseData> base_data;

    public List<Map<String,String>> getBaseData(){

        return base_data.get("result");
                    ^^^^^^ Error Type mismatch: cannot convert from BaseData to List<Map<String,String>>
    }

}

BaseData类

public class BaseData{

    Map<String,String>pager;

    List<Map<String,String>> result;

}

3 个答案:

答案 0 :(得分:1)

使用以下链接生成pojo类。 只需将您的json响应粘贴到给定的框中,并提供所需的类名称。和其他细节。

点击&#34; Zip&#34; json框下面的按钮。你会得到Java课程。用它。享受..

http://www.jsonschema2pojo.org/

答案 1 :(得分:1)

私有地图base_data; 替换为 BaseData base_data;

我测试了以下代码并且工作了。

public class Main {

    public static void main(String[] args) {
        JsonParser parser = new JsonParser();
        JsonObject json  = parser.parse("{\"id\":\"2\",\"type\":\"book\",\"base_data\":{\"result\":[{\"retailer\":\"Amazon\",\"price\":\"$50\"},{\"retailer\":\"Target\",\"price\":\"$60\"}],\"pager\":{\"current_page\":\"5\",\"link\":\"www.somesite.com\"}}}").getAsJsonObject();

        Gson gson = new Gson();
        Model model = gson.fromJson(json, Model.class);

    }
}

class Model {
    String id;
    String type;
    BaseData base_data;
}

class BaseData {
    Map<String, String> pager;
    List<Map<String,String>> result;
}

class Result {
    String retailer;
    String price;
}

如果您想在方法 getBaseData()上返回List<Map<String,String>>,可以在方法

中将 BaseData 转换为List<Map<String,String>>

答案 2 :(得分:1)

您输入错误的类型:

public List<Map<String,String>> getBaseData(){
    return base_data.get("result");
}

方法声明应更改为:

public BaseData getBaseData(){
    return base_data.get("result");
}

因为通过调用base_data.get("result"),您基本上从地图内的BaseData类型获取对象。

这应解决混合类型错误,不确定它是否解决了你想要做的事情