首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应对象中未填充GSON解组器的自定义对象的Java列表

响应对象中未填充GSON解组器的自定义对象的Java列表
EN

Stack Overflow用户
提问于 2013-11-06 16:19:39
回答 3查看 1.3K关注 0票数 2

基本上,我在一台服务器上将其分解为JSON,然后将其发送到另一台服务器,在那里应该对其进行解组。我使用一个名为list包装器的响应对象,这样如果有任何错误,我就可以传递它们。下面由badgerfish(jettison)编组的JSON,在resteasy类中,然后返回到另一个服务器,GSON将将其解锁到list包装对象,但其中的列表为null。有什么想法吗?注意:列表必须是泛型的,因为不同的对象可能会进入列表中,尽管列表中每次只有一种类型。

杰森

解编组

代码语言:javascript
复制
        GsonBuilder builder = new GsonBuilder();    
        Gson gson = builder.create(); 
        Object List;
        if (!JSON.equals("")) {
            List = gson.fromJson(new BufferedReader(new StringReader(JSON)), ListWrapper.class);
        }

列表包装类型

代码语言:javascript
复制
@XmlRootElement(name = "ListWrapper")

public class ListWrapper {

    private Vector<Object> objects;
    private String status;
    private int batch;

    private ValidationException e;

    public ListWrapper() {
        this.setStatus("Success");
    }

    public ListWrapper(Vector<Object> list) {
        this.setStatus("Success");
        this.objects = list;
    }

    public ListWrapper(int x) {
        this.setStatus("batch");
        this.batch = x;
    }

    public Vector<Object> getList() {
        return objects;
    }

    public void setList(Vector<Object> object) {
        this.objects = object;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @XmlJavaTypeAdapter(ThrowableAdapter.class)
    public ValidationException getE() {
        if (e != null) {
            return e;
        } else {
            return null;
        }
    }

    public void setE(ValidationException x) {
        this.e = x;
    }

    public int getBatch() {
        return batch;
    }

    public void setBatch(int batch) {
        this.batch = batch;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-06 23:06:22

不能直接使用ListWrapper反序列化,需要一个容器类,这就是为什么list是空的。顺便说一下,您的列表不是一个列表,而是一个映射(大括号限制了list的内容)。

我创建了一个正确解析JSON的代码,并为您提供了一些提取数据的简单功能。由于您希望在服务器之间传递的数据保持灵活,因此您将需要字符串来访问数据。

下面是可以自己复制和粘贴的代码。请记住,访问器方法基于您在示例中显示的结构。我向您提供了主要4种不同类型的数据,您可以从中提取。如果你需要更多的信息,请告诉我。

代码语言:javascript
复制
package stackoverflow.questions.q19817221;

import java.util.*;

import com.google.gson.Gson;

public class Q19817221 {

    public class ListWrapper {

        private Map list;
        private Map status;
        private Map batch;

        private Object extractValue(Map m) {
            return m.get("$");
        }

        public Integer getBatch() {
            return Integer.valueOf( (String) extractValue(batch));
        }

        public Object getValueFromList(String key) {
            try {
                Map m = (Map) list.get(key);
                if (m != null)
                    return extractValue(m);
            } catch (Exception e) {
                return list.get(key);
            }
            return null;
        }

        public Object getValueFromList(String secondLevelKey, String key) {

            Map secondLevelMap = (Map) list.get(secondLevelKey);
            try {
                Map m = (Map) secondLevelMap.get(key);
                if (m != null)
                    return extractValue(m);
            } catch (Exception e) {
                return list.get(key);
            }
            return null;

        }
    }

    public class Container {
        public ListWrapper ListWrapper;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
       String json = "{\"ListWrapper\":{\"batch\":{\"$\":\"0\"},\"list\":{\"@xmlns\":{\"xsi\":\"http://www.w3.org/2001/XMLSchema-instance\"},\"@xsi:type\":\"fidsUsers\",\"createdBy\":{\"$\":\"administrator\"},\"createdWhen\":{\"$\":\"2013-02-25T17:29:19-05:00\"},\"endDate\":{\"$\":\"2016-10-28T00:00:00-04:00\"}," +
            "\"isDisabled\":{\"$\":\"N\"},\"previousPasswords\":{\"$\":\"HXQDa4WxTdBmZtvhMVTgnw==@@@@zW6bdHkKdMN2p6CgRNjNHA==@@@@Sim7JN3kaHoXnh3KUS2++Q==@@@@Emz7zU0Wrm0lyb/K522O5A==@@ZirxzRl28JqfjOzIaMzAog==\"}," +
            "\"primaryKey\":{\"$\":\"David\"},\"pswdChgDate\":{\"$\":\"2013-07-12T08:27:46-04:00\"},\"pswdCount\":{\"$\":\"0\"},\"roleId\":{\"$\":\"Admin\"},\"roleIdFidsRoles\":{\"globalAccess\":{\"$\":\"Y\"},\"primaryKey\":{\"$\":\"Admin\"},\"roleDesc\":{\"$\":\"Administrator\"},\"roleId\":{\"$\":\"Admin\"}," +
            "\"updatedBy\":{\"$\":\"David\"}},\"startDate\":{\"$\":\"1992-07-28T00:00:00-04:00\"},\"updatedBy\":{\"$\":\"David\"},\"updatedWhen\":{\"$\":\"2013-10-02T10:46:31-04:00\"},\"userId\":{\"$\":\"David\"},\"userName\":{\"$\":\"David3\"},\"userPassword\":{\"$\":\"HXQDa4WxTdBmZtvhMVTgnw==\"}},\"status\":{\"$\":\"Success\"}}}";


       Container c = new Gson().fromJson(json, Container.class);
       ListWrapper lw = c.ListWrapper;

       System.out.println("batch:" + lw.getBatch());
       System.out.println("createdBy:" + lw.getValueFromList("createdBy"));
       System.out.println("@xsi:type: " + lw.getValueFromList("@xsi:type"));

       System.out.println("roleIdFidsRoles\\primaryKey: " + lw.getValueFromList("roleIdFidsRoles", "primaryKey"));



    }
}

这是执行结果:

代码语言:javascript
复制
batch:0
createdBy:administrator
@xsi:type: fidsUsers
roleIdFidsRoles\primaryKey: Admin
票数 1
EN

Stack Overflow用户

发布于 2013-11-06 16:34:57

通过查看您的ListWrapper类和您发布的json --您有一个不匹配的地方,这可能就是它失败的原因。

For:{"ListWrapper":{"batch":{"$":"0"},"list":{"@xmlns":{"xsi":"http:\/\/www.w3.org\/2001\/XMLSchema-instance"},"@xsi:type":"fidsUsers","createdBy":{"$":"administrator"},"createdWhen":{"$":"2013-02-25T17:29:19-05:00"},"endDate":{"$":"2016-10-28T00:00:00-04:00"},"isDisabled":{"$":"N"},"previousPasswords":{"$":"HXQDa4WxTdBmZtvhMVTgnw==@@@@zW6bdHkKdMN2p6CgRNjNHA==@@@@Sim7JN3kaHoXnh3KUS2++Q==@@@@Emz7zU0Wrm0lyb\/K522O5A==@@ZirxzRl28JqfjOzIaMzAog=="},"primaryKey":{"$":"David"},"pswdChgDate":{"$":"2013-07-12T08:27:46-04:00"},"pswdCount":{"$":"0"},"roleId":{"$":"Admin"},"roleIdFidsRoles":{"globalAccess":{"$":"Y"},"primaryKey":{"$":"Admin"},"roleDesc":{"$":"Administrator"},"roleId":{"$":"Admin"},"updatedBy":{"$":"David"}},"startDate":{"$":"1992-07-28T00:00:00-04:00"},"updatedBy":{"$":"David"},"updatedWhen":{"$":"2013-10-02T10:46:31-04:00"},"userId":{"$":"David"},"userName":{"$":"David3"},"userPassword":{"$":"HXQDa4WxTdBmZtvhMVTgnw=="}},"status":{"$":"Success"}}} --对我来说,它是一个object ListWrapper,它有三个字段: batch、list和status,其中batch是一个对象,其中一个字段是一个数字,list是一个映射,status是一个包含一个字符串的对象。

我对獾鱼并不熟悉,因为在您的ListWrapper中,请尝试将private Vector<Object> objects更改为private Map<String,Object> objects (当然还要匹配getter/setter),看看它是否有效。

票数 1
EN

Stack Overflow用户

发布于 2013-11-06 19:55:54

列表必须保持泛型,因为不同的对象可能会进入列表,尽管列表一次只包含一种类型。

如果您在未编组之前知道它是什么类型,那么只有它可以通过使用TypeToken来工作。

样本代码:

代码语言:javascript
复制
Type fooType = new TypeToken<Foo<Bar>>() {}.getType();
gson.toJson(foo, fooType);

gson.fromJson(json, fooType);

此外,定义将改为如下所示:

代码语言:javascript
复制
    public class ListWrapper {

        private Vector<T> objects;
        private String status;
        private int batch;
}

代码语言:javascript
复制
public class ListWrapper {

    private Vector<T extends someBaseObject> objects;
    private String status;
    private int batch;
}

具体取决于您决定如何实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19817221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档