2017-03-09 10 views
0

私は、あるマシンからネットワーク上に接続された別のマシンにデータを転送しました。転送される10〜20の値があります。私がしているのは、jsonの値をまとめてマーシャリングし、別のサーバー(ネットワーク上に接続されている別のマシン)にhttpポストコールで転送することだけです。それは光だ次HTTPコール経由でサーバー間でより多くの値を転送する最も良い方法は?

String student_id = json.getString("sid"); 
    String student_role_number = json.getString("rnumber"); 
    String student_name = json.getString("name"); 
    String isDayScholar = json.optString("dayscholar", "false"); 
    String stream = json.optString("stream", ""); 
    String class_section = json.getString("section"); 

のように私のコードのほとんどを食べるた私はJSONを構築するために、すべてのデータを荷造りする必要があるとサーバーBで、私はそれを非整列化する必要があるデータがサーバーAにサーバーAからサーバーBに流れると言います値が4〜5のときに20〜25のような値が増えると、このget/set操作を行うのがかなり重いと感じます。これを避ける/最小化する方法はありますか?

+1

データバインディングをサポートするJSONライブラリを使用することをお勧めします(JavaオブジェクトをJSONに自動的に変換して戻す)。 JacksonとGsonは最も人気のある2人です。 – dnault

+0

車輪を改造しないでください - あなたが見つけたように、車輪は通常正方形になります。まともなシリアライゼーションライブラリ(Jackson、GSON)を使用して、JavaクラスをJSONに変換して戻してください.Java Beansを使用すると、どちらのコードも2行で終了するはずです。あなたは現在のアプローチよりも(Base64エンコードされた)Javaシリアル化を使う方が良いでしょう。 –

答えて

1

20-25のような値がさらに多い場合、値が4〜5のときは軽いです。一部のデータ構造で必要なすべてのキーをハードコードできれば助かります。たとえば、あなたのケースで必要なすべてのキーは、SID、rnumber、名前、dayscholarなど

あるあなたの鍵のために別々のハードコードされたデータ構造体をキープ

org.json.JSONObject jsonObject = new org.json.JSONObject(); 
java.util.Map<String , Object> otherMap = new java.util.HashMap<>(); 

String[] myLovedKeys = {"sid" , "rnumber" , "name" , "dayscholar" , "stream" , "section"}; 
for(int x = 0; x < myLovedKeys.length; x++) 
{ 
    if(myLovedKeys[x].equals("dayscholar") || myLovedKeys[x].equals("stream")) 
    { 
     String value = ""; 
     if(myLovedKeys[x].equals("dayscholar")) 
     { 
      value = json.optString(myLovedKeys[x] , "false"); 
      jsonObject.put(myLovedKeys[x] , value); 
      otherMap.put(myLovedKeys[x] , value); 
     } 
     else 
     { 
      value = json.optString(myLovedKeys[x] , ""); // stream key-value 
      jsonObject.put(myLovedKeys[x] , value); 
      otherMap.put(myLovedKeys[x] , value); 
     } 
    } 
    else 
    { 
     String keyValue = json.getString(myLovedKeys[x]); 
     jsonObject.put(myLovedKeys[x] , keyValue); 
     otherMap.put(myLovedKeys[x] , keyValue); 
    } 
} 

これは、あなたが正確に現在あるキーを知ることができますループの内部で処理され、扱うキーに応じて多様な動作を扱うことができます

私がJSONObjectとjava.util.Mapを宣言した理由は、単純に事実を詳しく説明したいからですorg.json。*ライブラリがない場合は、java.util.Mapを使用して簡単に取り除くことができますが、 org.json *ライブラリを持っていれば、より快適な方法で問題に対処することもできます。今

otherMap.put(myLovedKeys[0] , "SomeValue"); 
otherMap.put(myLovedKeys[1] , "Other Value"); 
otherMap.put("sid" , "SomeValue"); 
otherMap.put("rnumber" , "toSomeName"); 
//myLovedKeys[0] = "sid" , myLovedKeys[1] = "rnumber" 

同様にあなたには、いくつかの変更が反映することができますが、それらの値を変更し、更新することができ、我々は我々が簡単に同様に

for(int x = 0; x < myLovedKeys.length; x++) 
{ 
    System.out.println("java.util.Map: [" myLovedKeys[x] + "=" + otherMap.get(myLovedKeys[x])); 
    System.out.println("org.json.JSONObject: " + myLovedKeys[x] + "=" + jsobObject.getJSONObject(myLovedKeys[x])); 
} 

のようなものを試みることができるし、データにアクセスすることを望んでいたと言うことができます jsonObject変数にあります。あなたが気づかなければならないことは、あなたのコードのどこかにすべてのキー名をハードコーディングするという苦痛に対処しなければならないということです。それはいくつかの入力を取るでしょう:)あなたのケース

+0

ここでは、ループ内で毎回 'keyValue'を宣言することによって、' myLovedKeys'スタック内の値全体を出力しようとしています...しかし、私は、jsonの各値をインデント/変数に代入したいと思います。そのような場合は、より良い選択肢がありますか? – Natasha

+0

多分、あなたは、ステートメントのすべての行でハードコードされたキー仕様を減らす方法について質問しましたが、今はあなたがjsonに変更を加えることに興味があると思いますか?あなたはjsonでキー値を内部的に変更したいですか?そして、いいえ、私は印刷について話していませんでした。私は、すべてのハードコードされたキー参照を別々に保管していたので、jsonのキー値ジェネリックにアクセスしようとしていました。 – ShayHaned

+0

編集を見直してください。 – ShayHaned

関連する問題