Retrofit是否支持json解析上的keypath或类似的东西?

时间:2016-01-27 15:07:23

标签: android json retrofit retrofit2

例如我有json看起来像:

<td style="background-color:    # plain text, matches if exact
\s*                             # matches zero or more (*) space characters (\s)
#                               # plain text, matches exactly one '#'
(                               # start of a group, doesn't match anything
     80F9CC                         # matches '80F9CC'
    |E1E3E4                         # or (|) 'E1E3E4'
    |D1D3D4                         # or 'D1D3D4'
    |73F6AB                         # or ...
    |3CEB88                         # or ...
)                               # end of the group    
;">                             # plain text; matches exactly this text

例如,我有对象User with field name。

是否有可能将数据数组解析为对象User的写方法?

类似

{
    "data": [
        {
            "name": "one"
        },
        {
            "name": "two"
        }
    ]
}

现在要做到这一点,我需要创建一个像

这样的包装类
Call<List<User>> getUsers(@KeyPath("data"))

在服务中我做下一步

public class UsersWrapper {
    @SerializeName("data")
    public ArrayList<User> users;
}

但我的所有请求只是对数据的响应,而是数组中的变量对象。

在这种情况下,我需要为任何数据请求创建包装器。痛苦:(

1 个答案:

答案 0 :(得分:2)

我这样做:

全局类@Repository("prestitolibroDao") public class PrestitoLibroDaoImpl extends AbstractDao<Integer, PrestitoLibro> implements PrestitoLibroDao{ public PrestitoLibro findById(int id) { PrestitoLibro prestitolibro = getByKey(id); if(prestitolibro!=null){ Hibernate.initialize(prestitolibro.getId()); } return prestitolibro; } public void savePrestitoLibro(PrestitoLibro prestitolibro) { persist(prestitolibro); } public void deletePrestitoLibroById(int id) { Query query = getSession().createSQLQuery("delete from Prestitolibro where id = :id"); query.setString("id",(String) Integer.toString(id)); query.executeUpdate(); } @SuppressWarnings("unchecked") public List<PrestitoLibro> findAllPrestitiLibro() { Criteria criteria = createEntityCriteria(); return (List<PrestitoLibro>) criteria.list(); } @SuppressWarnings("unchecked") public List<PrestitoLibro> findAllPrestitiLibroByPrestito(int prestitoId) { Criteria criteria = createEntityCriteria(); criteria.add(Restrictions.eq("id_prestito", prestitoId)); return (List<PrestitoLibro>) criteria.list(); } @SuppressWarnings("unchecked") public List<PrestitoLibro> findAllPrestitiLibroByLibro(int libroId) { Criteria criteria = createEntityCriteria(); criteria.add(Restrictions.eq("id_libro", libroId)); return (List<PrestitoLibro>) criteria.list(); } @Repository("prestitoDao") public class PrestitoDaoImpl extends AbstractDao<Integer, Prestito> implements PrestitoDao{ public Prestito findById(int id) { Prestito prestito = getByKey(id); if(prestito!=null){ Hibernate.initialize(prestito.getId()); } return prestito; } public void savePrestito(Prestito prestito) { persist(prestito); // Save prestito significa salvare il prestito o/e anche PrestitoLibiri } public void deletePrestitoBySss(String sss) { Query query = getSession().createSQLQuery("delete from Libro where snn = :snn"); query.setString("sss", sss); query.executeUpdate(); } @SuppressWarnings("unchecked") public List<Prestito> findAllPrestiti() { Criteria criteria = createEntityCriteria(); return (List<Prestito>) criteria.list(); } public Prestito findPrestitoBySss(String sss) { System.out.println("SSS : "+sss); Criteria criteria = createEntityCriteria(); criteria.add(Restrictions.eq("sss", sss)); Prestito prestito = (Prestito)criteria.uniqueResult(); if(prestito!=null){ Hibernate.initialize(prestito.getId()); } return prestito; } 来解析整个JSON

Wrapper<T>

public class Wrapper<T> { public List<T> data; } 解析实际数组;

User

然后,API接口:

public class User {
    public String name;
}

@GET("/people") Wrapper<User> getUsers(); 课程中,只需执行以下操作:

DataSource

<强> Upd1:
另一个解决方案是为@Override public List<User> getUsers() { Wrapper<User> usersWrapper = myApiInterface.getUsers(); return usersWrapper.data; } 类型创建自定义JsonDeserializer(如所描述的here),通过List<User>向您的自定义registerTypeAdapter对象注册,然后您可以反序列化你的Json直接进入Gson。虽然,这个解决方案带来了更多额外的代码,但我不清楚潜在的好处。