Android解析JsonデータのGson解析


Gsonはグーグルが公式に提供したjsonデータを解析するツールクラスです.jsonデータの解析はJSONObjectとJSOnArrayを組み合わせて解析データを用いることができるが,この原始的な手法は小データの解析には役立つが,複雑なデータの解析に伴ってタスクを遂行することは困難である.
GsonというjavaクラスライブラリはjavaオブジェクトをJSONに変換したり、JSON文字列を等しいjavaオブジェクトに変換したりすることができます.
具体的なGsom解析の過程を見てみましょう.まず、Personオブジェクト、List、List、Listpublic class JsonService { public JsonService() { // TODO Auto-generated constructor stub } public Person getPerson(){ Person person =new Person(1001," "," "); return person; } public List<Person> getlistperson(){ List<Person> list =new ArrayList<>(); Person person1 =new Person(1001, " ", " "); Person person2 =new Person(1002, " ", " "); list.add(person1); list.add(person2); return list; } public List<String> getListString(){ List<String> list =new ArrayList<>(); list.add(" "); list.add(" "); list.add(" "); return list; } public List<Map<String, String>> getListMaps(){ List<Map<String, String>> list =new ArrayList<>(); Map<String, String> map1 =new HashMap<String, String>(); map1.put("id", "1001"); map1.put("name", " "); map1.put("address", " "); Map<String, String> map2 =new HashMap<String, String>(); map2.put("id", "1002"); map2.put("name", " "); map2.put("address", " "); list.add(map1); list.add(map2); return list; }サーバ上の具体的なデータを知った後、Androidプロジェクトを新設し、4つのボタンを定義し、Personに対してそれぞれ実現しました.
対象,List<Person>,List<String>,List<Map<String,Object>の解析機能.具体的なxmlレイアウトコードはここではプレゼンテーションを行わず、読者が自分で作成します.
Gsonはサードパーティ製のフレームワークを使用するため、プロジェクトのlibフォルダの下に対応するjarファイルをインポートする必要があります.ここではgson-2.2.1を使用します.jar.サーバからデータを取得するにはネットワークが必要なので、Android Mainfestが必要です.xmlファイルからネットワークリクエスト権限を取得するには、次の手順に従います.
<uses-permission android:name="android.permission.INTERNET"/>
は、id、name、addressのset/getメソッドと、tostringメソッドと構造関数を含む対応するPersonクラスを作成します.具体的なコードは詳細に説明しません.
ネットワーク上のデータを取得するには、ネットワークアクセスクラスが必要です.ネットワークアクセス接続を開いて具体的なデータを取得します.(一部のコードに疑問がある場合は、前のXMLファイルの解析を参照してください.具体的なコードの説明はここでは省略します)
public class HttpUtils {
    public HttpUtils() {
    }

    public static String getJsonContent(String url_path) {
        try {
            //  http   ,       3s,  get      
            URL url = new URL(url_path);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(3000);
            connection.setRequestMethod("GET");
            connection.setDoInput(true);
            int code = connection.getResponseCode();
            if (code == 200) {
                return changeInputStrean(connection.getInputStream());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    //     outputString     ByteArrayOutputStream ,       ,          
    private static String changeInputStrean(InputStream inputStream) {
        String jsonString = null;
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        int len = 0;
        byte[] data = new byte[1024];
        try {
            while ((len = inputStream.read(data)) != -1) {
                outputStream.write(data, 0, len);
            }

            jsonString = new String(outputStream.toByteArray());

        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonString;
    }

}
すべての準備が整いました.次にしなければならないのはGsonを定義するツールクラスです.ここで理解しなければならないのは、サーバが具体的なデータオブジェクトをGsonを使用してJson文字列に変換することです.クライアントがしなければならないのは、json文字列を元のオブジェクトに復元することです.では、ここで定義するGsonツールクラスは、必ず各種データオブジェクトを満たすことができる,すなわちサーバがどのようなオブジェクトを渡しても,クライアントとしてオブジェクトのタイプを知るだけでオブジェクトを復元できるので,ここでは汎用T方式を用いて決定する.
public class GsonTools {

    public GsonTools() {
    }

    //    ,                 ,    gson         ,          

    /**
     *
     * @param jsonstring
     * @param cls
     * @param <T>          Gson   json   ,    json             ,       
     *            ,              ,                ,        T
     * @return
     */
    public static <T> T getperson(String jsonstring, Class<T> cls) {
        T t = null;

        Gson gson = new Gson();
        t = gson.fromJson(jsonstring, cls);

        return t;
    }

    /**
     *   Gson    List<Person>  
     * TypeToken          ,  api    
     *
     *
     * @param jsonstring
     * @param cls
     * @param <T>
     * @return
     */

    public static <T> List<T> getpersons(String jsonstring, Class<T> cls) {

        List<T> list = new ArrayList<T>();

        Gson gson = new Gson();
        //TypeToken   T               ,  jsonstring            
        //TypeToken<List<T>>(){}.getType()      jsonstring               list ,     T        
        list = gson.fromJson(jsonstring, new TypeToken<List<T>>() {
        }.getType());

        return list;
    }

    public static List<String> getList(String jsonString) {
        List<String> list = new ArrayList<>();
        Gson gson = new Gson();
        list = gson.fromJson(jsonString, new TypeToken<List<String>>() {
        }.getType());

        return list;
    }

    public static List<Map<String, Object>> getlistmap(String jsonstring) {

        List<Map<String, Object>> list = new ArrayList<>();

        Gson gson = new Gson();
        list = gson.fromJson(jsonstring, new TypeToken<List<Map<String, Object>>>() {
        }.getType());
        return list;
    }
}
残りのことは、APIのバージョンを使用してプライマリ・スレッドでのネットワーク・リクエストへのアクセスをサポートしていないため、具体的なクリック・イベントを実現する機能です.ここでは、便宜上、スレッドを直接定義してアクセスします.具体的なコードの実装では、必要に応じて異なる方法を使用することができます.
case R.id.gsonperson:

                new Thread(){
                    @Override
                    public void run() {
                        String path5 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=person";
                        String jsonstring = HttpUtils.getJsonContent(path5);
                        Person person = GsonTools.getperson(jsonstring,Person.class);
                        Log.i(TAG,person.toString());
                    }
                }.start();
                break;
            case R.id.gsonpersons:

                new Thread(){
                    @Override
                    public void run() {
                        String path6 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=persons";
                        String jsonstring = HttpUtils.getJsonContent(path6);
                        List<Person> list = GsonTools.getpersons(jsonstring, Person.class);
                        Log.i(TAG,list.toString());

                    }
                }.start();
                break;
            case R.id.gsonliststring:
                new Thread(){
                    @Override
                    public void run() {
                        String path7 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=liststring";
                        String jsonstring = HttpUtils.getJsonContent(path7);
                        List<String> list = GsonTools.getList(jsonstring);
                        Log.i(TAG,list.toString());
                    }
                }.start();
                break;

            case R.id.gsonlistmap:
                new Thread(){
                    @Override
                    public void run() {
                        String path8 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=listmap";
                        String jsonstring = HttpUtils.getJsonContent(path8);
                        List<Map<String,Object>> list =GsonTools.getlistmap(jsonstring);
                        Log.i(TAG,list.toString());

                    }
                }.start();
                break;

        }
ここではキーコードを書くだけで、残りのコードは、自分で補充することができます!
皆さん、ありがとうございます.作者の労働成果を尊重してください.転載する必要がある場合は、転載リンクを添付してください.