2016-04-25 6 views
1

JSONをシリアルポート経由で送信するプログラムがあります。有効なキーのテンプレート全体を必要としないようにするために、私はクライアントがMapを介してリクエストを送信するようにしています。Map <String、Object>でJava配列を保証する方法GSON toJsonおよびfromJsonの後に型を維持する

HashMap<String, Object> push = new HashMap<String, Object>(); 

push.put("Handshake", true); 
push.put("Instructions", instructions); 
push.put("RobotID", "1337"); 

これは、次のコードでJSONに変換されます。


Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String json = gson.toJson(myMap); 
System.out.println(json); 

そしてJSONは、シリアル接続を介して送信されます。

問題は、これが完全に有効なJSONを構築することです。

{ 
    "RobotID": "1337", 
    "Instructions": [ 
    "How to not be accidentally attacked by an autonomous robot.\n1. Don\u0027t stand in front of it.\n2. Don\u0027t try to run past it, it may catch you.\nThats it.", 
    "This was a triumph, I\u0027m making a note here. Huge success..." 
    ], 
    "Handshake": true 
} 

なぜこの問題が発生しますか?

HashMapの内容がObjectであるため、その型をチェックするのはあまりできません。したがって、私はObject.getClass()。getSimpleName();を使用します。そのようなクラスが少なくとも名前で一致することを確認します。これは私が必要としているほとんどのもので動作しますが、HashMapに変換された後、命令String []などのArrayオブジェクトはArrayListとして表示されます。これは、toArrayメソッドで必要な型の配列を取得できるようにするには問題ではありませんが、Object以外のものを使用して結果を表示しようとすると例外がスローされます。

ここで、データをHashMapに戻す方法を知る必要がある場合は、ここをクリックしてください。

Gson gson = new Gson(); 

Type flexibleContainerMap = new TypeToken<Map<String, Object>>(){}.getType(); 
Map<String, Object> jsonValueStore = gson.fromJson(json, flexibleContainerMap); 
String keys[] = new String[0]; 
keys = jsonValueStore.keySet().toArray(keys); 
int i = 0; 
while (i < keys.length) 
{ 

    SetValidate.updateValue(keys[i], jsonValueStore.get(keys[i])); 
    i++; 

} 

私はどのような援助は、Array/ArrayListの内部のデータにアクセスするための方法を含む受け入れられている、あなたは、少なくともここに私の状況の要点を取得願っています。目標は、クライアントに複雑さを加えることを避けることです。私は、配列をサーバー上の配列として読み込むことが可能であることを望むだろう。あなたがそうするためのアイデアを提供できるなら、それはすばらしいことでしょう。

答えて

1

タイプ情報がjsonに存在しないため、タイプを維持できません。

あなたはなどJsonObject/JsonArrayを使用してJSONを読むことができます:

JsonObject root = new JsonParser().parse(json).getAsJsonObject(); 

JsonArray instructions = root.getAsJsonArray("Instructions"); 

あなたはまた、むしろハッシュマップよりも、JSONを作成するために、もう一方の端でこれを使用することができます。

+0

実行時に内容が不明なので、この実現可能性について検討する必要があります。これが成功すれば、それを答えとしてマークします。すでにありがとう! –

+0

もう一度おねがいします。私は配列のために必要なだけで、現在のコードに適合させるために多少の努力を払ってくれましたが、あなたの助けは大いに感謝していました。 –

関連する問題