3

RESTful Android モバイル クライアントを開発しています。アプリとサーバー間の情報交換は JSON です。そのため、JSON 応答とデータを表すためにどのデータ構造を選択するかについて、少し混乱しています。LinkedHashMap<> で停止しましたが、私が知る限り、JSON は順不同です。インターネット上で、人々が Map<> や HashMap<> を使っているのを見ました。

質問 - この目的に最適なデータ構造は何ですか? または、一義的な答えがない場合-私が言及したデータ構造を使用することの長所と短所。

4

5 に答える 5

5

私は最初の答えに同意しません。REST パラダイムは、操作ではなくオブジェクトを操作できるように開発されました。

私にとって最も賢明なアプローチは、クライアント側で Bean を宣言し、json 応答を解析してそれらを介して要求する場合です。シリアライゼーション/デシリアライゼーションにはGSON ライブラリを使用することをお勧めします。JsonObject/JsonArrayが最良の選択になることはほとんどありません。

使用しようとしている操作の例を挙げていただければ、より正確にお手伝いできるかもしれません。

編集: GSONの例もいくつか挙げてみましょう。このスレッドを使用して、さまざまなライブラリを比較してみましょう。

ほとんどの場合、REST サービスはオブジェクトと通信します。ショップへの参照がある商品の投稿を作成するとします。

{ "name": "Bread",
  "price": 0.78,
  "produced": "08-12-2012 14:34",
  "shop": {
     "name": "neighbourhood bakery"
  }
}

次に、次の Bean を宣言すると:

public class Product {
    private String name;
    private double price;
    private Date produced;
    private Shop shop;
    // Optional Getters and setters. GSON uses reflection, it doesn't need them
    // However, better declare them so that you can access the fields
}

public class Shop {
   private String name;
    // Optional Getters and setters. GSON uses reflection, it doesn't need them
    // However, better declare them so that you can access the fields
}

次を使用してjsonを逆シリアル化できます。

String jsonString; // initialized as you can
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setDateFormat("MM-dd-yyyy HH:mm"); // setting custom date format
Gson gson = gsonBuilder.create();
Product product = gson.fromJson(jsonString, Product.class);
// Do whatever you want with the object it has its fields loaded from the json

一方、より簡単に json にシリアル化できます。

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setDateFormat("MM-dd-yyyy HH:mm"); // setting custom date format
Gson gson = gsonBuilder.create();
String jsonString = gson.toJson(product);
于 2012-12-13T18:41:01.113 に答える
2

サーバー要求から JSON 文字列を受信して​​解析することについて話しているのですか?

そのためには、次を使用できます。

import org.json.JSONArray;
import org.json.JSONObject;

これらを使用して、POST 要求から JSON 配列を読み取り、結果の情報をプロジェクトの Class オブジェクトに格納します。

JSONArray の各項目について、次のように JSONObject と属性を抽出できます。

for (int i = 0; i < jsonArray.length(); i++) {
    JSONObject jsonObject = jsonArray.getJSONObject(i);
    jsonObject.getString("text");
}

上記のように、実際にデータを保存する限り、JSON データはソースに応じてさまざまな形式になる可能性があるため、通常はクライアント エンドで解析され、使用するためにアプリケーション クラス オブジェクトに保存されます。または、より一般的には、次を使用してデータを保存できますMap<String, Object>

于 2012-12-13T18:26:55.040 に答える
0

次のように、xstreamを使用してJSON をシリアル化しました。

XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("myAlias", MyClass.class); // requires a no argument constructor
System.out.println(xstream.toXML(product));     

わかりました、コメントの紳士は逆シリアル化の例を望んでいます。

XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
xstream.alias("myAlias", MyClass.class);
Product product = (Product)xstream.fromXML(json);
System.out.println(product.getName());

さらにサポートが必要な場合はお知らせください...

于 2012-12-13T18:54:43.517 に答える
0

最も単純なマッピング以外のことをしている場合は、完全なクラス構造を使用する必要があります。クラス階層を JSON のデータ構造のミラーとして作成し、Jacksonを使用して、ObjectMapper を使用して JSON をクラス階層に直接マップします。

このソリューションを使用すると、オブジェクトをマップにキャストしたり、JSONObject または JSONArray をいじったりする必要がなく、コード内にマルチレベルのマップ トラバーサルがありません。JSON 文字列を取得して ObjectMapper にフィードし、ObjectMapper によって自動的にマップされた子オブジェクト (コレクションも含む) を含むオブジェクトを取得するだけです。

于 2012-12-13T18:39:38.563 に答える