Android解析JSONデータのいくつかの方式の比較

4260 ワード

Json紹介
Json(JavaScript Object Natotion)は軽量レベルのデータ交換フォーマットであり、読み取りや書き込みが容易な特性を有し、主にデータの転送に用いられる.JsonはXmlに取って代わるデータ構造であり、xmlよりもコンパクトであり、データ伝送トラフィックと占有帯域幅を低減する.
Json構文
{}表示対象
[]は配列を表す
「」は値または属性を表します.
:前がkey、後ろがvalueであることを示し、valueは文字列、数値、または別の配列またはオブジェクトであってもよい
例{「name」:「tom」}は、属性名がnameであり、値がtomであることを示す.[{"name":"tom"},{"name":"jack"}]この2つのオブジェクトを表す配列は,{"name":["tom","jack"}これはname配列を持つオブジェクトに等しい.
従来の方法(org.jsonパッケージを使用)
次に、json文字列を生成し、json文字列を解析する方法を示す.
 
    /**
     *       json  
     * @param user
     * @return
     */
    public static String buildJson(User user) {
        try {
            JSONObject juser = new JSONObject();
            juser.put("name", user.getName());
            juser.put("pwd",user.getPwd());
            return juser.toString();
        }catch (JSONException e) {
            Log.e("JSON_ERROR",e.getMessage());
        }
        return null;
    }

    /**
     *  json       
     * @param json
     * @return
     */
    public static User getUser(String json) {
        JSONTokener jsonTokener = new JSONTokener(json);
        try {
            JSONObject user = (JSONObject) jsonTokener.nextValue();
            if (user != null) {
                String name = user.getString("name");
                String pwd = user.getString("pwd");
                return new User(name,pwd);
            }
        }catch (JSONException e){
            Log.e("JSON_ERROR",e.getMessage());
        }
        return null;
    }

    /**
     *  json     User  
     * @param key
     * @param json
     * @return
     */
    public static List getUsers(String key,String json) {
        List list = new ArrayList();
        try {
            JSONObject jsonObject = new JSONObject(json);
            if (jsonObject != null) {
                JSONArray array = jsonObject.getJSONArray(key);
                if (array != null && array.length() > 0 ) {
                    for (int i = 0; i < array.length(); i ++) {
                        JSONObject userJson = array.getJSONObject(i);
                        User  user = new User();
                        user.setName(userJson.getString("name"));
                        user.setPwd(userJson.getString("pwd"));
                        list.add(user);
                    }
                }
                return list;
            }
        }catch (JSONException e) {
            Log.e("JSON_ERROR",e.getMessage());
        }
        return null;
    }

org.Jsonパッケージには、JSOnArray、JSOnObject、JSOnStringer、JSOnTokener、JSOnONExceptionの5つのクラスが用意されています.
JSONException異常類
JSONSStringer秩序構造
JSONObject無秩序構造
JSOnArray配列オブジェクト
JSOnStringerによって入力されるキー値のペアは規則的であり、JSOnObjectによって入力されるキー値のペアは無秩序であり、一般的にJSOnObjectを使用すればよいが、いくつかのネストされたJsonおよびいくつかのJSOnArrayにkeyがなくvalueのみの場合、JSOnStringerを使用する.
クラスライブラリGsonの使用
    /**
     *   Gson        String
     * @param user
     * @return
     */
    public static String getJson(User user) {
        Gson gson = new Gson();
        return gson.toJson(user);
    }

    /**
     *   Gson String     
     * @param json
     * @return
     */
    public static User getUser(String json) {
        Gson gson = new Gson();
        try {
            return gson.fromJson(json,User.class);
        }catch (Exception e) {
            Log.e("TAG",e.getMessage());
        }
        return null;
    }

    /**
     *   Gson String       
     * @param json
     * @return
     */
    public static List getUsers(String json) {
        Gson gson = new Gson();
        try {
           return gson.fromJson(json, new TypeToken>(){}.getType());
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

Gsonのようなjsonライブラリでよく使われるのはGsonのほかにJacksonとFastJsonで、この3つの個性エネルギーの対比についてネット上では諸説あるが、もちろん彼らが実現したコードと大きな関係があるが、個人的なテストの後、JacksonとFastJsonのシーケンス化と逆シーケンス化の性能が相当することが分かった.Gson性能は比較的弱いが安定している.