JSON

Android 解析JSON数据格式(5)

字号+ 作者:H5之家 来源:H5之家 2017-06-26 18:04 我要评论( )

使 用gson,我们可以非常轻松的实现数据对象和json对象的相互转化,其中我们最常用的就是两个方法,一个是fromJSON(),将json对象转换 成我们需要的数据对象,另一个是toJSON(),这个就是将我们的数据对象转换成jso

使 用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"/>

最后我们来看看效果图:

Android 解析JSON数据格式

Android 解析JSON数据格式

这样我们就完成了客户端与服务器端通过json来进行数据的交换

?

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Ajax技术与原理的介绍

    Ajax技术与原理的介绍

    2017-06-17 14:00

  • Android开发学习之路-网络编程之xml、json

    Android开发学习之路-网络编程之xml、json

    2017-06-13 13:03

  • JSON学习---ISuperObject接口的简单实用

    JSON学习---ISuperObject接口的简单实用

    2017-06-07 10:19

  • 【JAVAWEB学习笔记】22

    【JAVAWEB学习笔记】22

    2017-06-02 17:04

网友点评