2

基本上,我在一台服务器上将其编组为 JSON,然后将其发送到另一台服务器,在那里它应该被解组。我使用了一个名为列表包装器的响应对象,因此如果有任何错误,我可以将它们传递出去。通过 badgerfish(jettison) 在下面将 JSON 编组在一个 resteasy 类中,然后返回到另一个服务器,GSON 将解组为一个 listwrapper 对象,但里面的列表是空的。有任何想法吗?注意:列表必须保持通用,因为不同的对象可能会进入列表,尽管列表一次总是只有一种类型。

json

解组

        GsonBuilder builder = new GsonBuilder();    
        Gson gson = builder.create(); 
        Object List;
        if (!JSON.equals("")) {
            List = gson.fromJson(new BufferedReader(new StringReader(JSON)), ListWrapper.class);
        }

列表包装器类型

@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;
    }
}
4

3 回答 3

1

列表必须保持通用,因为不同的对象可能会进入列表,尽管列表一次总是只有一种类型。

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

示例代码:

Type fooType = new TypeToken<Foo<Bar>>() {}.getType();
gson.toJson(foo, fooType);

gson.fromJson(json, fooType);

此外,定义将更改为如下内容:

    public class ListWrapper {

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

或者

public class ListWrapper {

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

取决于您决定如何实施。

于 2013-11-06T19:55:54.453 回答
1

您不能直接使用反序列ListWrapper化,您需要一个容器类,这就是您列表为空的原因。顺便说一句,您的列表不是列表,而是地图(大括号限制 的内容list)。

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

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

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"));



    }
}

这是执行结果:

batch:0
createdBy:administrator
@xsi:type: fidsUsers
roleIdFidsRoles\primaryKey: Admin
于 2013-11-06T23:06:22.167 回答
1

通过查看您的ListWrapper班级和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"}}}对我来说,它object ListWrapper有 3 个字段,分别命名为:批次、列表和状态,其中批次是一个对象,其中一个字段是数字,列表是地图,状态是其中有一个字符串的对象。

我不熟悉badgerfish,话虽如此,在您ListWrapper尝试更改private Vector<Object> objectsprivate Map<String,Object> objects(当然还有匹配的getter/setter)并查看是否可行

于 2013-11-06T16:34:57.747 回答