ANDROIDと.Net間JSON実践

51182 ワード

Asp.Netエンド:
JsonHelper.cs
using System.Runtime.Serialization.Json;

using System.IO;

using System.Text;



namespace NetJSON

{

    /// <summary>

    /// JSON           

    /// </summary>

    public class JsonHelper

    {

        /// <summary>

        /// JSON   

        /// </summary>

        public static string JsonSerializer<T>(T t)

        {

            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));

            MemoryStream ms = new MemoryStream();

            ser.WriteObject(ms, t);

            string jsonString = Encoding.UTF8.GetString(ms.ToArray());

            ms.Close();

            return jsonString;

        }



        /// <summary>

        /// JSON    

        /// </summary>

        public static T JsonDeserialize<T>(string jsonString)

        {

            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));

            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));

            T obj = (T)ser.ReadObject(ms);

            return obj;

        }

    }

}

JSON.aspx.cs
using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Collections;



namespace NetJSON

{

    public partial class JSON : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            string flag = Request["action_flag"];

            string jsonStr = "";

            switch (flag)

            {

                case "person":

                    var p = new Person();

                    p.Id = 100;

                    p.Name = "  ";

                    p.Address = "    ";

                    jsonStr = JsonHelper.JsonSerializer<Person>(p);

                    break;

                case "persons":

                    List<Person> persons = new List<Person>();

                    persons.Add(new Person

                    {

                        Id = 101,

                        Name = "  ",

                        Address = "    "

                    });

                    persons.Add(new Person

                    {

                        Id = 102,

                        Name = "  ",

                        Address = "    "

                    });

                    persons.Add(new Person

                    {

                        Id = 103,

                        Name = "  ",

                        Address = "    "

                    });

                    jsonStr = JsonHelper.JsonSerializer<List<Person>>(persons);

                    break;

                case "stringList":

                    List<string> strs = new List<string>();

                    strs.Add("china");

                    strs.Add("beijing");

                    strs.Add("chaoyang");

                    jsonStr = JsonHelper.JsonSerializer<List<string>>(strs);

                    break;

                case "listMap":

                    List<Hashtable> listMap = new List<Hashtable>();

                    Hashtable ht = new Hashtable();

                    ht.Add("Id", 203);

                    ht.Add("Name", "  ");

                    ht.Add("Age", 36);

                    listMap.Add(ht);

                    ht = new Hashtable();

                    ht.Add("Id", 204);

                    ht.Add("Name", "  ");

                    ht.Add("Age", 46);

                    ht.Add("Married", true);

                    listMap.Add(ht);



                    List<SortedDictionary<string, object>> list = new List<SortedDictionary<string, object>>();

                    SortedDictionary<string, object> dict = new SortedDictionary<string, object>();

                    dict.Add("Id", 334);

                    dict.Add("Name", "XYZ");

                    list.Add(dict);

                    dict = new SortedDictionary<string, object>();

                    dict.Add("Id", 334);

                    dict.Add("Address", "XYZ");

                    dict.Add("Married", false);

                    list.Add(dict);

                    jsonStr = JsonHelper.JsonSerializer<List<SortedDictionary<string, object>>>(list);

                    break;

            }

            Response.Write(jsonStr);

            Response.End();

        }

    }



    public class Person

    {

        public int Id { get; set; }

        public string Name { get; set; }

        public string Address { get; set; }

    }

}

戻るJSON結果:
person:
{「Address」:「北京朝陽」、「Id」:100、「Name」:「張三」}
persons:
[{"Address":[北京昌平],[Id]:101,[Name]:[李四]},{[Address]:[北京順義],[Id]:102,[Name]:[王五]},{[Address]:[天津南開],[Id]:103,[Name]:[趙六]]]
stringList:
["china","beijing","chaoyang"]
listMap:
[{"Key":[Id],[Value]:201},{"Key":[Name],[Value]:[趙]]],[{"Key":[Id],[Value]:203},{"Key":[Birthday],[Value]:"/Date(232214400000+0800)/],{"Key":[Married],[Value]:true}]
 
Android:
Person.java
package com.example.netjson;



public class Person {

    private int id;

    private String name;

    private String address;



    public Person() {

        super();

    }



    public Person(int id, String name, String addrss) {

        super();

        this.id = id;

        this.name = name;

        this.address = addrss;

    }



    public int getId() {

        return id;

    }



    public void setId(int id) {

        this.id = id;

    }



    public String getName() {

        return name;

    }



    public void setName(String name) {

        this.name = name;

    }



    public String getAddress() {

        return address;

    }



    public void setAddress(String address) {

        this.address = address;

    }



    @Override

    public String toString() {

        return "Person [addrss=" + address + ", id=" + id + ", name=" + name

                + "]";

    }

}

JSONTool.java
package com.example.netjson;



import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;



import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;



/**

 *    JSON     

 * 

 * @author wulianghuan

 * 

 */

public class JSONTool {



    public JSONTool() {



    }



    public static String createjsonString(String key, Object value) {

        JSONObject jsonObject = new JSONObject();

        try {

            jsonObject.put(key, value);

        } catch (JSONException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return jsonObject.toString();

    }



    /**

     *       

     * 

     * @param key

     * @param jsonString

     * @return

     */

    public static Person getPerson(String jsonString) {

        Person person = new Person();

        try {

            JSONObject jsonObject = new JSONObject(jsonString);

            JSONObject personObject = jsonObject.getJSONObject(key);

            person.setId(personObject.getInt("Id"));

            person.setName(personObject.getString("Name"));

            person.setAddress(personObject.getString("Address"));

        } catch (JSONException e) {

            e.printStackTrace();

        }

        return person;

    }



    /**

     *         

     * 

     * @param key

     * @param jsonString

     * @return

     */

    public static List<Person> getPersons(String jsonString) {

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

        try {

            JSONArray jsonArray = new JSONArray(jsonString);

            //   json   

            for (int i = 0; i < jsonArray.length(); i++) {

                JSONObject jsonObject2 = jsonArray.getJSONObject(i);

                Person person = new Person();

                person.setId(jsonObject2.getInt("Id"));

                person.setName(jsonObject2.getString("Name"));

                person.setAddress(jsonObject2.getString("Address"));

                list.add(person);

            }

        } catch (JSONException e) {

            e.printStackTrace();

        }



        return list;

    }



    /**

     *   String    

     * 

     * @param key

     * @param jsonString

     * @return

     */

    public static List<String> getList(String jsonString) {

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

        try {

            JSONArray jsonArray = new JSONArray(jsonString);

            for (int i = 0; i < jsonArray.length(); i++) {

                String msg = jsonArray.getString(i);

                list.add(msg);

            }

        } catch (JSONException e) {

            e.printStackTrace();

        }

        return list;

    }



    /**

     *      Map    

     * 

     * @param key

     * @param jsonString

     * @return

     */

    public static List<Map<String, Object>> getListMap(String jsonString) {

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

        try {

            JSONArray jsonArray = new JSONArray(jsonString);

            for (int i = 0; i < jsonArray.length(); i++) {

                JSONArray jsonArray2 = jsonArray.getJSONArray(i);

                Map<String, Object> tmpMap = new HashMap<String, Object>();

                for (int j = 0; j < jsonArray2.length(); j++) {

                    Map<String, Object> map = new HashMap<String, Object>();

                    JSONObject jsonObject2 = jsonArray2.getJSONObject(j);

                    Iterator<String> iterator = jsonObject2.keys();

                    while (iterator.hasNext()) {

                        String json_key = iterator.next();

                        Object json_value = jsonObject2.get(json_key);

                        if (json_value == null) {

                            json_value = "";

                        }

                        map.put(json_key, json_value);

                    }

                    tmpMap.put(map.get("Key").toString(), map.get("Value"));

                }

                list.add(tmpMap);

            }

        } catch (JSONException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }



        return list;

    }

}

HTTPUtils.java
package com.example.netjson;



import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;



public class HTTPUtils {



    public HTTPUtils() {

    }



    public static String getJsonContent(String path) {

        try {

            URL url = new URL(path);

            HttpURLConnection connection = (HttpURLConnection) url

                    .openConnection();

            connection.setConnectTimeout(30000);

            connection.setRequestMethod("GET");

            connection.setDoInput(true);

            int code = connection.getResponseCode();

            if (code == 200) {

                return changeInputStream(connection.getInputStream());

            }

        } catch (MalformedURLException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

        return null;

    }



    /**

     *                  

     * 

     * @param inputStream

     * @return

     */

    private static String changeInputStream(InputStream inputStream) {

        String jsonString = "";

        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;

    }

}

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >



    <LinearLayout

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:orientation="vertical" >



        <Button

            android:id="@+id/person"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:onClick="click"

            android:text="person" />



        <Button

            android:id="@+id/persons"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:onClick="click"

            android:text="persons" />



        <Button

            android:id="@+id/stringList"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:onClick="click"

            android:text="stringList" />



        <Button

            android:id="@+id/listMap"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:onClick="click"

            android:text="listMap" />



        <TextView

            android:id="@+id/tvShow"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/hello_world" />

    </LinearLayout>



</RelativeLayout>

MainActivity.java
package com.example.netjson;



import java.util.List;

import java.util.Map;



import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.app.Activity;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.widget.TextView;



public class MainActivity extends Activity {



    String PATH = "http://192.168.0.102:7020/JSON.aspx";

    String TAG = "JSON";

    TextView tvShow;

    Handler handler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            switch (msg.what) {

            case 0x123:

                tvShow.setText(msg.obj.toString());

                break;

            }

        }

    };



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tvShow = (TextView) findViewById(R.id.tvShow);

    }



    public void click(final View v) {

        final int vId = v.getId();

        new Thread() {

            public void run() {

                asynCall(vId);

            }

        }.start();

    }



    private void asynCall(int viewId) {

        String jsonStr = "";

        switch (viewId) {

        case R.id.person:

            String path1 = PATH + "?action_flag=person";

            String jsonString1 = HTTPUtils.getJsonContent(path1);

            Person person = JSONTool.getPerson(jsonString1);

            jsonStr = person.toString();

            break;

        case R.id.persons:

            String path2 = PATH + "?action_flag=persons";

            String jsonString2 = HTTPUtils.getJsonContent(path2);

            List<Person> list2 = JSONTool.getPersons(jsonString2);

            jsonStr = list2.toString();

            break;

        case R.id.stringList:

            String path3 = PATH + "?action_flag=stringList";

            String jsonString3 = HTTPUtils.getJsonContent(path3);

            List<String> list3 = JSONTool.getList(jsonString3);

            jsonStr = list3.toString();

            break;

        case R.id.listMap:

            String path4 = PATH + "?action_flag=listMap";

            String jsonString4 = HTTPUtils.getJsonContent(path4);

            List<Map<String, Object>> list4 = JSONTool.getListMap(jsonString4);

            jsonStr = list4.toString();

            break;

        }

        Message msg = new Message();

        msg.what = 0x123;

        msg.obj = jsonStr;

        handler.sendMessage(msg);

    }



    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }



}

Manifest.xml
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.netjson"

    android:versionCode="1"

    android:versionName="1.0" >



    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="17" />



    <uses-permission android:name="android.permission.INTERNET" />



    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.example.netjson.MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />



                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>



</manifest>

出力結果:
Person[addrss=北京朝陽,id=100,name=張三][person[addrss=北京昌平,id=101,name=李四],Person[addrss=北京順義,id=102,name=王五],Person[addrss=天津南開,id=103,name=趙六][china,beijing,chaoyang][{Name=趙,Id=201},{Married=true,Birthday=/Day(232214400000+0800)/,Id=203}