2017-10-17 5 views
1

私はGsonを使用してJson文字列を作成しています。今まではメンバー数が比較的少ない比較的少人数のクラスをシリアライズしていましたので、必要なメンバーのクラスを作成しただけで、jsonを作成するのにtoJsonを使用しました。この質問に関連する場合は、Androidアプリケーションの内部にあります。Gsonを使用して大きなJson文字列を作成する正しい方法

今、私は多くのフィールドといくつかのレベルでより複雑なjsonを作成する必要があります。 JSONの例(これの少なくとも一部はちょうどそれの「精神」と表示する):この場合、

"sleep" : { 
    "program" : { 
    "appName" : "name", 
    "appVersion" : "1.7" 
    "serverVersion" : 19 
    }, 
    "userType" : "new", 
    "userInfo" : { 
     "firstName" : "Hans", 
     "lastName" : "Schmidt", 
     "city" : "Berlin", 
     "country" : "Germany", 
    }, 
    "settings" : { 
     "setting1" : "y", 
     "setting2" : "none" 
} 
... 
} 

を私はすべての木のために別のクラスを作成する必要がありますか?たとえば、 "program"パートのクラス、 "userInfo"のクラスなどを作成し、そのメンバーとして小さなクラスをすべて含む "sleep"ルートのクラスを作成し、その上にtoJsonを使用しますか?私はそれが動作すると思いますが、それは単一のJsonのために非常に多くのクラスを作成する最も効率的な方法ですか?

+0

何が問題なのですか?gsonがあなたの仕事をしますか? –

+1

jsonのpojo表現が必要な場合は、提案したようなさまざまなツリーレベルに異なるクラスが必要です。あなたがおそらく(私はGsonを知らないが、私はそれがJacksonと非常に似ていると思うだろう)必要がないなら、map/JSONObjectインスタンスとlists/JSONArrayインスタンスの組み合わせを使用するだけでもよい。 – Thomas

+0

あなたはクラスを書くだけで、お互いに実装することができます.Gsonは仕事をします –

答えて

0

あなたは目標を達成するために、地図を使用できるため

。極端な場合には(私が意味する、場合にあなたが任意のクラスを作成する必要はありません)、あなたはこのJSONを作成する場合:

{ 
    "sleep":{ 
     "userInfo":{ 
     "firstName":"Hans", 
     "lastName":"Schmidt", 
     "country":"Germany", 
     "city":"Berlin" 
     }, 
     "settings":{ 
     "setting2":"none", 
     "setting1":"y" 
     }, 
     "program":{ 
     "appVersion":"1.7", 
     "serverVersion":19, 
     "appName":"name" 
     }, 
     "userType":"new" 
    } 
} 

あなたが行うことができます:

Gson gson = new Gson(); 

    Map<String, Object> finalObject= new HashMap<>(); 
    Map<String, Object> sleep= new HashMap<>(); 
    Map<String, Object> program= new HashMap<>(); 
    Map<String, String> userInfo= new HashMap<>(); 
    Map<String, Object> settings= new HashMap<>(); 

    program.put("appName", "name"); 
    program.put("appVersion", "1.7"); 
    program.put("serverVersion", 19); 

    userInfo.put("firstName", "Hans"); 
    userInfo.put("lastName", "Schmidt"); 
    userInfo.put("city", "Berlin"); 
    userInfo.put("country", "Germany"); 


    settings.put("setting1", "y"); 
    settings.put("setting2", "none"); 

    sleep.put("program", program); 
    sleep.put("userType", "new"); 
    sleep.put("userInfo", userInfo); 
    sleep.put("settings", settings); 

    finalObject.put("sleep", sleep); 

    System.out.println(gson.toJson(finalObject)); 

しかし、別の答えで述べたように、しばしばPOJOを作成することが推奨されます。

EDIT

は、これを実行するために別の方法があります。あなたは、あなたが(繰り返しをマッピングを改善し、排除するために)クラスを作成する必要があり、常に同じコードを使用することに気付いた場合

JsonObject finalJsonObject= new JsonObject(); 
    JsonObject jsonSleep= new JsonObject(); 
    JsonObject jsonProgram= new JsonObject(); 
    JsonObject jsonUserInfo= new JsonObject(); 
    JsonObject jsonSettings= new JsonObject(); 

    jsonUserInfo.addProperty("firstName", "Hans"); 
    jsonUserInfo.addProperty("lastName", "Schmidt"); 
    jsonUserInfo.addProperty("country", "Germany"); 
    jsonUserInfo.addProperty("city", "Berlin"); 


    jsonSettings.addProperty("setting2", "none"); 
    jsonSettings.addProperty("setting1", "y"); 

    jsonProgram.addProperty("appVersion", "1.7"); 
    jsonProgram.addProperty("serverVersion", 19); 
    jsonProgram.addProperty("appName", "name"); 


    jsonSleep.add("userInfo", jsonUserInfo); 
    jsonSleep.add("settings", jsonSettings); 
    jsonSleep.add("program", jsonProgram); 
    jsonSleep.addProperty("userType", "new"); 

    finalJsonObject.add("sleep", jsonSleep); 

    System.out.println(String.valueOf(finalJsonObject)); 

JsonObjectクラスを使用します。数回使用するクラスがいくつかある場合、この方法を使用することができます(必要な各クラスを作成しないでください)。

+0

POJOを使うことをお勧めしますか? json表現を受け取っていて、それを逆シリアル化する必要があるだけでなく、 –

+0

@YonatanNir答えを編集しました。 –

1

は、次の2つのアプローチをとることができます。

1)は、各「レベル」のためのJavaクラスを作成し、POJOフィールドで遊びます。私はこれが正しいアプローチだと思う。 GSONシリアライザはそのために最適化されているので、パフォーマンスについて心配する必要はありません。

2)「手で」JSONを作成します。これはお勧めできませんし、パフォーマンスの大幅な向上はありません。また、あなたはPOOのパワーを使用していません。

とにかくできるだけ少ないレベルで使用するようにデータを整理しようとすると、これは間違いなくパフォーマンスに役立ちます。

0

これは、モデルクラスと親クラスを作成することで実現できます。例

Class Sleep{ 


hashmap<String,Object> sleep; 

//getters and setters 



} 



Class program{ 
String appName,appVersion,serverVersion; 

// getters and setters; 


} 

Class userInfo{ 
String firstName,lastName,city,country 

// getters and setters 

} 



Main(){ 

Sleep sleep = new Sleep(); 

Hashmap<String,Object> sl = new HashMap<>(); 
sleep.setSleep() = sl; 

program p = new program(); 
p.setappName("name"); 
p.setappVersion("1.7"); 
p.serverVersion("19"); 

sl.put("program",p); 

// similarly for the userInfo 

new Gson().toJson(sleep); 

// This will give you the nested json as you wanted. 
} 
0

Google​​
このコードを使用すると、役に立つ可能性があります。

GsonBuilder builder = new GsonBuilder(); 
Gson gson = builder.create(); 
String json = gson.toJson(List<user>); 
関連する問題