【问题标题】:Retrofit accessing multiple models in Json response改造在 Json 响应中访问多个模型
【发布时间】:2015-02-25 09:38:35
【问题描述】:

我在下面有一些 JSON。之前我在 JSON 响应中只有 items 元素,并且使用改造通过以下代码访问它。效果很好。

但是现在我已经添加了推荐部分,我已经创建了推荐模型,但是我现在如何从响应的推荐/项目部分访问数据?

编辑 也许有更好的方法来返回这些数据。可能有 500 个项目,但只有 20/30 个列表,所以我认为拆分数据比复制数据更好。

JSON

[
{
    "recommendation": [
        {
            "following": true,
            "list_id": "29",
            "list_name": "list29",
        },
        {
            "following": false,
            "list_id": "28",
            "list_name": "list28",
        }
    ]
},
{
    "items": [
        {
            "description": [
                "line1",
                "line2",
                "line3"
            ],
            "image1": "4367218/img1.jpg",
            "item_id": 5600,
            "title": "Title 1",
            "recommendation_id": 29
        },
        {
            "description": [
                "line1",
                "line2",
                "line3"
            ],
            "image1": "342345/img1.jpg",
            "item_id": 3600,
            "title": "Tite2",
            "recommendation_id": 28
        }
    ]
}
]

推荐模型

public class Recommendation {

    private Boolean following;
    private int listId;
    private String listName;

    public Boolean getFollowing() {
        return following;
    }

    // more getters and setters
}

物品模型

public class Item {

    private int item_id;
    private String title;
    private ArrayList<String> description;
    private String image1;
    private int recommendation_id;

    // more getters and setters
}

改造 GET

// feed
@GET("/items/{user_id}/{num_items}")
public void getFeedData(@Path("user_id") int user_id, @Path("num_items") Integer num_items, Callback<List<Item>> response);

【问题讨论】:

    标签: java android json retrofit


    【解决方案1】:
    {
        "recommendation": [
            "data":{
                "following": true,
                "list_id": "29",
                "list_name": "list29"
            },
           "data": {
                "following": false,
                "list_id": "28",
                "list_name": "list28"
            }
        ]
    },
    {
        "items": [
            "data_item":{
                "description": [
                    "line1",
                    "line2",
                    "line3"
                ],
                "image1": "4367218/img1.jpg",
                "item_id": 5600,
                "title": "Title 1",
                "recommendation_id": 29
            },
             "data_item":{
                "description": [
                    "line1",
                    "line2",
                    "line3"
                ],
                "image1": "342345/img1.jpg",
                "item_id": 3600,
                "title": "Tite2",
                "recommendation_id": 28
            }
        ]
    }
    

    型号:

    public class Model{
    
    ArrayList<Data> recommendation ; 
    ArrayList<DataItem> items ;
    }
    

    数据模型:

    public class Data{
    
       private boolean following ;
       private String list_id ;
       private String list_name ;
    
    }
    

    数据项模型:

    public class DataItem{
    
    private String description [];
    private String image1 ;
    private String item_id ;
    private String title ;
    private String recommendation_id ;
    
    }
    

    【讨论】:

    • 请问我应该如何在适配器中使用这个模型。我目前正在做 Model model = getItem(position); DataItem item = model.getDataItem().get(position);但它只取数组中的第一个 dataItem 然后发出另一个请求
    • 您可以在构造函数的适配器中传递dataItem的arraylist,然后在getCount中您应该执行dataItem.size(),然后它将迭代到dataItem的所有位置
    • 如果我设置 ArrayAdapter 它工作正常,它只是当它的 ArrayAdapter
    • 模型是一个对象而不是一个列表,所以在这种情况下会出现问题,你必须只使用 DataItem
    • 如果你需要在同一个适配器中,那你为什么要使用两个 JsonArray。俱乐部数据和数据项在一个数组中并使用它。它会让你的生活更轻松
    【解决方案2】:

    我建议将您的 JSON 根从数组转换为对象:

    {
        "recommendation": [...],
        "items": [...]
    }
    

    然后让 Retrofit 将 JSON 响应解析成一个新模型,比如说Response

    public class Response {
        private Recommendation[] recommendation;
        private Item[] items;
        // your getters
    }
    

    【讨论】:

    • 好的,谢谢,我现在正在尝试。响应模型中不应该是ArrayList吗?
    • 如果您的响应返回一个事物列表,每个项目由Response 类表示,然后让Retrofit 将其解析为Response[],并且您的JSON 应该有一个数组作为根,每个数组项应该跟随我的答案中的架构
    • 如果您的意思是如何检索items,那么在Response 中有一个getter 表示getItems() { return items; } 并在您的适配器中调用该方法
    猜你喜欢
    • 2019-03-14
    • 2020-05-13
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多