web-dev-qa-db-ja.com

クラスをJSONObjectに変換する

私はこのようないくつかのクラスを持っています。クラスをJSONObject形式に変換したい。

import Java.io.Serializable;

import com.google.gson.annotations.SerializedName;

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @SerializedName("id")
    private Integer mId;
    @SerializedName("name")
    private String mName = "";
    @SerializedName("email")
    private String mEmail;

    public Integer getId() {
        return mId;
    }
    public void setId(Integer id) {
        mId = id;
    }

    public String getName() {
        return mName;
    }
    public void setName(String name) {
        mName = name;
    }

    public String getEmail() {
        return mEmail;
    }
    public void setEmail(String email) {
        mEmail = email;
    }
}

これらのクラスを次のようにJSONObject形式に変換できることを知っています。

    User user = new User();
    JSONObject jsonObj = new JSONObject();
    try {
        jsonObj.put("id", user.getId());
        jsonObj.put("name", user.getName());
        jsonObj.put("email", user.getEmail());
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

問題は、多くのファイルでこれよりもはるかに長い多くの異なるクラスに対してこれを行う必要があることです。 GSONを使用してmyClassからJSONObjectを入力し、クラス構造が変更されるたびに編集する必要がないようにすることはできますか?

以下はJSON文字列を返しますが、不要な引用符を付けて送信するREST APIを介してリクエストを送信するシステムに送信する場合と同様に、オブジェクトとして必要です。

User user = new User();
Gson gson = new Gson();
Object request = gson.toJson(user);

これを、取得したオブジェクトを要求する別のJSONビルダーで使用すると

{"request":"{"id":"100","name":"Test Name","email":"[email protected]"}"}

欲しいとき

{"request":{"id":"100","name":"Test Name","email":"[email protected]"}}
5
TTransmit

以下がGSONで機能することがわかりました。

    User = new User();
    Gson gson = new Gson();
    String jsonString = gson.toJson(user);
    try {
        JSONObject request = new JSONObject(jsonString);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

ただし、これはタイプセーフではありません。

17
TTransmit

これは、Reflectionを使用してJSONObjectを構築するために使用できる大まかな例です。

警告それはきれいではなく、実際の型安全性は含まれていません。

public static JSONObject quickParse(Object obj) throws IllegalArgumentException, IllegalAccessException, JSONException{
    JSONObject object = new JSONObject();

    Class<?> objClass = obj.getClass();
    Field[] fields = objClass.getDeclaredFields();
    for(Field field : fields) {
        field.setAccessible(true);
        Annotation[] annotations = field.getDeclaredAnnotations();
        for(Annotation annotation : annotations){
            if(annotation instanceof SerializedName){
               SerializedName myAnnotation = (SerializedName) annotation;
               String name = myAnnotation.value();
               Object value = field.get(obj);

               if(value == null)
                  value = new String("");

               object.put(name, value);
            }
        }
    }   

    return object;
}

使用例は次のとおりです。

User user = new User();
JSONObject obj = quickParse(user);
System.out.println(obj.toString(3));

出力

{
   "id": "",
   "name": "",
   "email": ""
}
2
Patrick M