使 用gson,我们可以非常轻松的实现数据对象和json对象的相互转化,其中我们最常用的就是两个方法,一个是fromJSON(),将json对象转换 成我们需要的数据对象,另一个是toJSON(),这个就是将我们的数据对象转换成json对象。下面我们也通过一个综合的例子来看看gson的使用方 法:
public class JsonService
{
? ? public Person getPerson()
? ? {
? ? ? ? Person person = new Person(1, "xiaoluo", "广州");
? ? ? ? return person;
? ? }
? ??
? ? public List<Person> getPersons()
? ? {
? ? ? ? List<Person> persons = new ArrayList<Person>();
? ? ? ? Person person = new Person(1, "xiaoluo", "广州");
? ? ? ? Person person2 = new Person(2, "android", "上海");
? ? ? ? persons.add(person);
? ? ? ? persons.add(person2);
? ? ? ? return persons;
? ? }
? ??
? ? public List<String> getString()
? ? {
? ? ? ? List<String> list = new ArrayList<String>();
? ? ? ? list.add("广州");
? ? ? ? list.add("上海");
? ? ? ? list.add("北京");
? ? ? ? return list;
? ? }
? ??
? ? public List<Map<String, String>> getMapList()
? ? {
? ? ? ? List<Map<String, String>> list = new ArrayList<Map<String, String>>();
? ? ? ? Map<String, String> map1 = new HashMap<String, String>();
? ? ? ? map1.put("id", "001");
? ? ? ? map1.put("name", "xiaoluo");
? ? ? ? map1.put("age", "20");
? ? ? ? Map<String, String> map2 = new HashMap<String, String>();
? ? ? ? map2.put("id", "002");
? ? ? ? map2.put("name", "android");
? ? ? ? map2.put("age", "33");
? ? ? ? list.add(map1);
? ? ? ? list.add(map2);
? ? ? ? return list;
? ? }
}
public static void main(String[] args)
? ? {
? ? ? ? Gson gson = new Gson();
? ? ? ? JsonService jsonService = new JsonService();
? ? ? ? Person person = jsonService.getPerson();
? ? ? ? System.out.println("person: " + gson.toJson(person));
? ? ? ? // ? ?对于Object类型,使用 fromJson(String, Class)方法来将Json对象转换成Java对象
? ? ? ? Person person2 = gson.fromJson(gson.toJson(person), Person.class);
? ? ? ? System.out.println(person2);
? ? ? ? System.out.println("------------------------------------------------");
? ? ? ??
? ? ? ? List<Person> persons = jsonService.getPersons();
? ? ? ? System.out.println("persons: " + gson.toJson(persons));
? ? ? ? /*
? ? ? ? ?* 对于泛型对象,使用fromJson(String, Type)方法来将Json对象转换成对应的泛型对象
? ? ? ? ?* new TypeToken<>(){}.getType()方法
? ? ? ? ?*/
? ? ? ? List<Person> persons2 = gson.fromJson(gson.toJson(persons), new TypeToken<List<Person>>(){}.getType());
? ? ? ? System.out.println(persons2);
? ? ? ? System.out.println("------------------------------------------------");
? ? ? ??
? ? ? ? List<String> list = jsonService.getString();
? ? ? ? System.out.println("String---->" + gson.toJson(list));
? ? ? ? List<String> list2 = gson.fromJson(gson.toJson(list), new TypeToken<List<String>>(){}.getType());
? ? ? ? System.out.println("list2---->" + list2);
? ? ? ? System.out.println("------------------------------------------------");
? ? ? ??
? ? ? ? List<Map<String, String>> listMap = jsonService.getMapList();
? ? ? ? System.out.println("Map---->" + gson.toJson(listMap));
? ? ? ? List<Map<String, String>> listMap2 = gson.fromJson(gson.toJson(listMap), new TypeToken<List<Map<String, String>>>(){}.getType());
? ? ? ? System.out.println("listMap2---->" + listMap2);
? ? ? ? System.out.println("------------------------------------------------");
? ? }
看看控制台的输出:
person: {"id":1,"name":"xiaoluo","address":"广州"}
Person [id=1, name=xiaoluo, address=广州]
------------------------------------------------
persons: [{"id":1,"name":"xiaoluo","address":"广州"},{"id":2,"name":"android","address":"上海"}]
[Person [id=1, name=xiaoluo, address=广州], Person [id=2, name=android, address=上海]]
------------------------------------------------
String---->["广州","上海","北京"]
list2---->[广州, 上海, 北京]
------------------------------------------------
Map---->[{"id":"001","age":"20","name":"xiaoluo"},{"id":"002","age":"33","name":"android"}]
listMap2---->[{id=001, age=20, name=xiaoluo}, {id=002, age=33, name=android}]
------------------------------------------------
三、在Android客户端解析服务器端的json数据
下面我们来完成一个综合的例子,Android客户端通过一个AsyncTask异步任务请求服务器端的某些数据,然后在解析完这些数据后,将得到的数据内容更新到我们的Spinner这个UI控件当中。
我们首先来看下服务器端的代码:
@WebServlet("/CityServlet")
public class CityServlet extends HttpServlet
{
? ? private static final long serialVersionUID = 1L;
?
? ? public CityServlet()
? ? {
? ? ? ? super();
? ? }
?
? ? protected void doGet(HttpServletRequest request,
? ? ? ? ? ? HttpServletResponse response) throws ServletException, IOException
? ? {
? ? ? ? this.doPost(request, response);
? ? }
?
? ? protected void doPost(HttpServletRequest request,
? ? ? ? ? ? HttpServletResponse response) throws ServletException, IOException
? ? {
? ? ? ? response.setContentType("text/html;charset=utf-8");
? ? ? ? request.setCharacterEncoding("utf-8");
? ? ? ? response.setCharacterEncoding("utf-8");
? ? ? ? PrintWriter writer = response.getWriter();
? ? ? ??
? ? ? ? String type = request.getParameter("type");
? ? ? ? if("json".equals(type))
? ? ? ? {
? ? ? ? ? ? List<String> cities = new ArrayList<String>();
? ? ? ? ? ? cities.add("广州");
? ? ? ? ? ? cities.add("上海");
? ? ? ? ? ? cities.add("北京");
? ? ? ? ? ? cities.add("湖南");
? ? ? ? ? ? Map<String, List<String>> map = new HashMap<String, List<String>>();
? ? ? ? ? ? map.put("cities", cities);
? ? ? ? ? ? String citiesString = JSON.toJSONString(map);
? ? ? ? ? ? writer.println(citiesString);
? ? ? ? }
? ? ? ??
? ? ? ? writer.flush();
? ? ? ? writer.close();
? ? }
?
}
如果客户端请求的参数是type=json,则响应给客户端一个json数据格式
接着来看看客户端的代码,首先看看客户端的布局文件,其实就是一个按钮和一个Spinner控件,当点击按钮后,通过http协议请求服务器端的数据,然后在接收到后再更新我们的Spinner控件的数据
<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" >
?
? ? <TextView
? ? ? ? android:id="@+id/textView1"
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:layout_alignParentLeft="true"
? ? ? ? android:layout_alignParentTop="true"
? ? ? ? android:layout_marginLeft="64dp"
? ? ? ? android:layout_marginTop="64dp"
? ? ? ? android:textSize="20sp"
? ? ? ? android:text="城市" />
? ??
? ? <Spinner?
? ? ? ? android:id="@+id/spinner"
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:layout_alignTop="@id/textView1"
? ? ? ? android:layout_toRightOf="@id/textView1"/>
?
? ? <Button
? ? ? ? android:id="@+id/button"
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:layout_alignLeft="@+id/textView1"
? ? ? ? android:layout_below="@+id/spinner"
? ? ? ? android:layout_marginLeft="22dp"
? ? ? ? android:layout_marginTop="130dp"
? ? ? ? android:text="加载数据" />
?
</RelativeLayout>
在Android客户端写一个解析json数据格式的类:
public class JsonUtils
{
? ? /**
? ? ?* @param citiesString ? ?从服务器端得到的JSON字符串数据
? ? ?* @return ? ?解析JSON字符串数据,放入List当中
? ? ?*/
? ? public static List<String> parseCities(String citiesString)
? ? {
? ? ? ? List<String> cities = new ArrayList<String>();
? ? ? ??
? ? ? ? try
? ? ? ? {
? ? ? ? ? ? JSONObject jsonObject = new JSONObject(citiesString);
? ? ? ? ? ? JSONArray jsonArray = jsonObject.getJSONArray("cities");
? ? ? ? ? ? for(int i = 0; i < jsonArray.length(); i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cities.add(jsonArray.getString(i));
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? catch (Exception e)
? ? ? ? {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ??
? ? ? ? return cities;
? ? }
}
当然我们的HttpUtils类也不可少:
public class HttpUtils
{
? ? /**
? ? ?* @param path ? ?请求的服务器URL地址
? ? ?* @param encode ? ?编码格式
? ? ?* @return ? ?将服务器端返回的数据转换成String
? ? ?*/
? ? public static String sendPostMessage(String path, String encode)
? ? {
? ? ? ? String result = "";
? ? ? ? HttpClient httpClient = new DefaultHttpClient();
? ? ? ? try
? ? ? ? {
? ? ? ? ? ? HttpPost httpPost = new HttpPost(path);
? ? ? ? ? ? HttpResponse httpResponse = httpClient.execute(httpPost);
? ? ? ? ? ? if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? HttpEntity httpEntity = httpResponse.getEntity();
? ? ? ? ? ? ? ? if(httpEntity != null)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? result = EntityUtils.toString(httpEntity, encode);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? catch (Exception e)
? ? ? ? {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? finally
? ? ? ? {
? ? ? ? ? ? httpClient.getConnectionManager().shutdown();
? ? ? ? }
? ? ? ??
? ? ? ? return result;
? ? }
}
最后来看看我们的MainActivity类:
public class MainActivity extends Activity
{
? ? private Spinner spinner;
? ? private Button button;
? ? private ArrayAdapter<String> adapter;
? ? private ProgressDialog dialog;
? ? private final String CITY_PATH_JSON = "http://172.25.152.34:8080/httptest/CityServlet?type=json";
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState)
? ? {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ??
? ? ? ? spinner = (Spinner)findViewById(R.id.spinner);
? ? ? ? button = (Button)findViewById(R.id.button);
? ? ? ? dialog = new ProgressDialog(MainActivity.this);
? ? ? ? button.setOnClickListener(new OnClickListener()
? ? ? ? {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onClick(View v)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? dialog.setTitle("提示信息");
? ? ? ? ? ? ? ? dialog.setMessage("loading......");
? ? ? ? ? ? ? ? dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
? ? ? ? ? ? ? ? dialog.setCancelable(false);
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? new MyAsyncTask().execute(CITY_PATH_JSON);
? ? ? ? ? ? }
? ? ? ? });
? ? }
?
? ? public class MyAsyncTask extends AsyncTask<String, Void, List<String>>
? ? {
? ? ? ? @Override
? ? ? ? protected void onPreExecute()
? ? ? ? {
? ? ? ? ? ? dialog.show();
? ? ? ? }
? ? ? ? @Override
? ? ? ? protected List<String> doInBackground(String... params)
? ? ? ? {
? ? ? ? ? ? List<String> cities = new ArrayList<String>();
? ? ? ? ? ? String citiesString = HttpUtils.sendPostMessage(params[0], "utf-8");
? ? ? ? ? ? // ? ?解析服务器端的json数据
? ? ? ? ? ? cities = JsonUtils.parseCities(citiesString);return cities;
? ? ? ? }
? ? ? ? @Override
? ? ? ? protected void onPostExecute(List<String> result)
? ? ? ? {
? ? ? ? ? ? adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, result);
? ? ? ? ? ? adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
? ? ? ? ? ? spinner.setAdapter(adapter);
? ? ? ? ? ? dialog.dismiss();
? ? ? ? }
? ? }
? ??
? ? @Override
? ? public boolean onCreateOptionsMenu(Menu menu)
? ? {
? ? ? ? getMenuInflater().inflate(R.menu.main, menu);
? ? ? ? return true;
? ? }
?
}
当然别往了开启我们的网络授权
<uses-permission?android:name="android.permission.INTERNET"/>最后我们来看看效果图:
这样我们就完成了客户端与服务器端通过json来进行数据的交换
?