2

基本的に、あるサーバーで JSON にマーシャリングしてから、それを別のサーバーに送信し、アンマーシャリングする必要があります。リスト ラッパーと呼ばれる応答オブジェクトを使用して、エラーが発生した場合にそれらを渡すことができるようにします。バッジャーフィッシュ (jettison) によって以下の RESTEasy クラスでマーシャリングされた JSON を使用して、他のサーバーに返されると、GSON は listwrapper オブジェクトにアンマーシャリングしますが、内部のリストは null です。何か案は?注: リストには一度に 1 つのタイプしか含まれませんが、異なるオブジェクトがリストに入る可能性があるため、リストは汎用的なままにする必要があります。

ジェイソン

アンマーシャリング

        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

ListWrapper投稿したクラスと aを調べる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 ListWrapperbatch、list、status という名前の 3 つのフィールドを持つ a です。ここで、batch は 1 つのフィールドが数値であるオブジェクトであり、list はマップであり、status は 1 つの文字列を含むオブジェクトです。

私はアナグマに慣れていませんが、あなたが(そしてもちろんゲッター/セッターに一致するように)ListWrapper変更しようとして、それが機能するかどうかを確認してください。private Vector<Object> objectsprivate Map<String,Object> objects

于 2013-11-06T16:34:57.747 に答える
1

direct を使用して逆シリアル化することはできません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 に答える