2016-09-18 4 views
0

キー値のペアを持つjsonのModelクラスを作成する方法の例を多数確認しました。しかし、フィールド名がjsonの値に依存する次のタイプのjsonを持っています。 jsonの下で見てください -jsonのモデルクラス

{ "args" : 
    [{ 
    "name":"fullName", 
    "value":"Vikram", 
    "type":"String" 
    }, 
    { 
    "name":"userName", 
    "value":"[email protected]", 
    "type":"String" 
    } 
    ] 
} 

このjsonのモデルクラスを作成する方法を教えてもらえますか?私は私のモデルクラスは以下のようにする必要があり期待以上のJSONについては -

public class Model { 

    private String userName; 
    private String fullName; 
... 


    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String name) { 
     this.userName = name; 
    } 

    public String getFullName() { 
     return fullName; 
    } 

    public void setFullName(String value) { 
     this.fullName = value; 
    } 
} 

が可能かどうかということですか?

{ "args" : 
    [{ 
    "fullName":"Vikram", 
    "userName":"[email protected]" 
    } 
    ] 
} 
+0

このサイトを試しましたか? http://www.jsonschema2pojo.org –

+0

はい、私はそれを試しましたが、期待していたように私にモデルクラスを与えていませんでした。 –

+0

なぜですか?たとえば、 'username'と' fullname'は最初のJSONの例のキーではありません。 2番目のJSON用ですが、Modelクラスのリストを格納する 'args'キーを持つJavaクラスも必要です –

答えて

0
public class Model { 

    private String name; 
    private String value; 
    private String type; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

} 

このクラスを使用する - 私は、JSONなどのためのモデルクラスを作成する方法を知っています。データを格納する。作成

List<Model> list =new ArrayList<>(); 

オブジェクト作成モデルクラスは、その値を設定してリストに追加します。

+0

を参照していますが、私のモデルクラスは以下のようになるはずです: public class Model { プライベートString userName; プライベートString fullName; ... public String getUserName(){ return userName; } public void setUserName(String name){ これです。userName = name; } public String getFullName(){ return fullName; } パブリックvoid setFullName(文字列値){ this.fullName = value; } } –

+0

@VikramBhatiあなたが実際に望むものを少し混乱させます。 1つのjsonサンプルを2つではなく正確に投稿してください。サンプルjsonには、保存するすべてのパラメータが含まれている必要があります –

+0

私は何を言いたいかを参照してください。 username、fullnameなどのフィールドにアクセスするために私のアプリで使用するクラス(UserInfo)が必要です。今私は上記で共有したjsonの応答を得ています。私はそのタイプのjson応答をJavaオブジェクト(userInfoオブジェクト –

1

あなたが言及した方法でモデルを作成することは、レイアウトがコンパイル時に分からないため不可能です。

class Model { 
    private final Map<String, Value> fields = new HashMap<>(); 

    public Value getValue(String fieldName) { 
     return fields.get(fieldName); 
    } 

    public static Model deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { 
     Model ret = new Model(); 

     JsonArray args = json.getAsJsonObject() // Get 'args' array 
      .get("args") 
      .getAsJsonArray(); 

     for(JsonElement e : args) { 
      JsonObject o = e.getAsJsonObject(); 
      ret.fields.put(
       o.get("name").getAsString(), 
       new Value(o.get("type").getAsString(), o.get("value")) 
      ); 
     } 

     return ret; 
    } 
} 
class Value { 
    private final String type; 
    private final JsonElement obj; 

    public Value(String type, JsonElement obj) { 
     this.type = type; 
     this.obj = obj; 
    } 

    public String getType() { 
     return type; 
    } 

    public String getAsString() { 
     return obj.getAsString(); 
    } 
    ... 
} 

次にあなたがこのdeserializeメソッドを登録することができます

おそらく、便利な方法は、いくつかの辞書にシリアライズすることですが、値の種類を保存する(Javaはタイププロバイダを持っていません)タイプアダプターとして:

Gson gson = new GsonBuilder() 
    .registerTypeAdapter(
     Model.class, 
     (JsonDeserializer<Model>) Model::deserialize 
    ).create(); 

String json = ...; 

Model m = gson.fromJson(json, Model.class); 

System.out.println(m.getValue("fullName").getAsString()); // 'Vikram' 
System.out.println(m.getValue("userName").getAsString()); // '[email protected]' 
+0

ありがとうございます。それは私の疑いを明らかにした。さて、私はこのアプローチを試みます。しかし、私のアプリでこのモデルクラスにアクセスすることは難しいでしょう。このクラスのユーザー名にアクセスしたいとしたら、m.getValue( "fullName")を記述する必要があります。これは、getUserName()型getterおよびsetterのすべての発生を変更する必要がある方法です。しかし、はい、その本当のレイアウトはコンパイル時には分かりません。 –

関連する問題