JSON 解析

秒速五厘米 2022-07-24 09:18 543阅读 0赞
  1. [ JSON 使用讲解 ][JSON _]这篇文章讲解了,JSON的介绍以及使用GSON解析。今天,我们就在Android项目中使用两种方式解析JSON数据。如果你对JSON,还不熟悉,那么请看[JSON 使用讲解][JSON _]。

一.搭建服务以及制造JSON数据。

1.服务器选择的Tomcat,下载链接。下载安装成功后,服务启动后,在浏览器中输入’http://localhost:8080/',看到如下截图,那就说明启动成功了。

Center

2.Tomcat服务器启动好后,找到它的安装目录‘D:\Apache Software Foundation\Tomcat 6.0\webapps’(我的安装目录是 ‘D:\Apache Software Foundation\Tomcat 6.0\webapps’),然后在该目录下,新建文件夹‘json’,在该文件夹中,创建文件‘get_data.json’,在该文件中输入JSON字符串,格式如下‘[{“id”:1,”name”:”zhangsan”,”age”:30},{“id”:2,”name”:”lisi”,”age”:20}]’。

3.此时在浏览器中输入‘http://localhost:8080/json/get\_data.json’,如果出现如下截图,说明上面的操作是成功的。![Center 1][]

  1. 经过上面3步,我们就把JSON数据创建好了,接下来就是Android客户端的实现了。

二.Android客户端的实现。

1.创建Android项目。这个不用详细描述了。

2.首先记得在AndroidManifest.xml中加入网络权限。

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

3.网络请求实现。使用URLConnection实现的。

  1. public static String getData1(String urlStr) {
  2. String resultData = "";
  3. // 构造URL
  4. try {
  5. URL url = new URL(urlStr);
  6. // 打开连接
  7. URLConnection con = url.openConnection();
  8. con.setConnectTimeout(10 * 1000);
  9. con.setReadTimeout(10 * 1000);
  10. InputStream is = con.getInputStream();
  11. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  12. String line = null;
  13. StringBuffer sb = new StringBuffer();
  14. while ((line = br.readLine()) != null) {
  15. sb.append(line);
  16. }
  17. resultData=sb.toString();
  18. return resultData;
  19. } catch (MalformedURLException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. } catch (IOException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. return null;
  27. }

4.功能实现。

  1. MainActivity中加入一个按钮,点击的时候获取网络数据,并且请求网络要在子线程中进行。**有一点需要补充就是手机访问电脑时的IP地址,如果你使用手机访问电脑,IP地址还是‘localhost’,肯定是访问不了的,因为‘localhost’指的是本机,如果使用手机访问‘localhost’,那肯定是访问不到电脑的。这个IP可以有两种写法,一种是,当你使用模拟器访问的话,IP可以写成‘10.0.2.2’;另一种是,直接写为电脑在局域网内的IP地址,例如‘192.168.1.114’(我电脑的IP地址);建议直接写成电脑在局域网内的IP地址**。详细实现如下代码所示,
  2. public class MainActivity extends Activity {
  3. String url = "http://192.168.1.114:8080/json/get_data.json";
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. findViewById(R.id.btn_getdata).setOnClickListener(
  9. new OnClickListener() {
  10. @Override
  11. public void onClick(View v) {
  12. // TODO Auto-generated method stub
  13. new MyThread().start();
  14. }
  15. });
  16. }
  17. class MyThread extends Thread {
  18. @Override
  19. public void run() {
  20. String jsonStr = NetWorkUtils.getData1(url);
  21. if (!TextUtils.isEmpty(jsonStr)) {
  22. Log.e("jsonStr", jsonStr);
  23. parseJsonData(jsonStr);
  24. // parseJsonData1(jsonStr);
  25. }
  26. }
  27. }
  28. }

解析JSON采用三种方式。

5.使用JSONObject解析。代码很简单,就不多说了,示例如下,

  1. /**
  2. * 使用JSONArray和JSONObject解析
  3. *
  4. * @param jsonStr
  5. */
  6. private void parseJsonData(String jsonStr) {
  7. try {
  8. JSONArray array = new JSONArray(jsonStr);
  9. for (int i = 0; i < array.length(); i++) {
  10. JSONObject jsonObject = array.getJSONObject(i);
  11. int id = jsonObject.getInt("id");
  12. String name = jsonObject.getString("name");
  13. int age = jsonObject.getInt("age");
  14. Person person = new Person(id, name, age);
  15. Log.e("person", person.toString());
  16. }
  17. } catch (JSONException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. }
  21. }

6.使用GSON解析。代码就更简单,示例如下,

  1. /**
  2. * 使用GSON解析
  3. *
  4. * @param jsonStr
  5. */
  6. private void parseJsonData1(String jsonStr) {
  7. Gson gson = new Gson();
  8. List<Person> list = gson.fromJson(jsonStr,
  9. new TypeToken<List<Person>>() {
  10. }.getType());
  11. for (Person person : list) {
  12. Log.e("person", person.toString());
  13. }
  14. }

7.使用JackJson解析,做了一个JackJson工具类,代码如下:

  1. /**
  2. * jackjson
  3. */
  4. public class JackJsonUtils {
  5. /**
  6. * 解析
  7. *
  8. * @param content
  9. * @param valueType
  10. * @return
  11. */
  12. public static <T> T fromJson(String content, Class<T> valueType) {
  13. ObjectMapper objectMapper = new ObjectMapper();
  14. try {
  15. return objectMapper.readValue(content, valueType);
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. return null;
  20. }
  21. /**
  22. * 生成json
  23. *
  24. * @param object
  25. * @return
  26. */
  27. public static String toJSon(Object object) {
  28. ObjectMapper objectMapper = new ObjectMapper();
  29. try {
  30. return objectMapper.writeValueAsString(object);
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. return null;
  35. }
  36. }

调用代码,

  1. /**
  2. * jackjson解析
  3. *
  4. * @param jsonStr
  5. */
  6. public void parserByJackJson(String jsonStr) {
  7. Person[] persons = JackJsonUtils.fromJson(jsonStr, Person[].class);
  8. for (Person person : persons) {
  9. Log.e("person", person.toString());
  10. }
  11. }

运行后的截图如下,

Center 2

PS:也许你使用JackJson解析可能会报错,日志截图如下:

Center 3

解决方法是,在你的实体类中加入无参的构造函数就完美解决了!希望能帮到你!实体类的代码如下:

  1. public class Person implements Serializable {
  2. /**
  3. *
  4. */
  5. private static final long serialVersionUID = 1L;
  6. private int id;
  7. private String name;
  8. private int age;
  9. public Person() {
  10. super();
  11. // TODO Auto-generated constructor stub
  12. }
  13. public Person(int id, String name, int age) {
  14. super();
  15. this.id = id;
  16. this.name = name;
  17. this.age = age;
  18. }
  19. public int getId() {
  20. return id;
  21. }
  22. public void setId(int id) {
  23. this.id = id;
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. public int getAge() {
  32. return age;
  33. }
  34. public void setAge(int age) {
  35. this.age = age;
  36. }
  37. @Override
  38. public String toString() {
  39. return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
  40. }
  41. }

三.总结。

  1. 使用了三种方式去解析JSON数据。个人建议,如果你是在Android开发,建议使用GSON,毕竟是谷歌自己的东西,使用放心,可靠!如果你是做后台服务或者接口开发,建议使用JackJson,强大、快速!相信你现在已经对JSON解析有更深入的了解了![示例代码下载链接][Link 2]

PS:推荐文章 java web开发(一) 环境搭建

  1. [Android学习资料整理][Android]
  2. [ Android WebView(一) WebView详解 ][Android WebView_ WebView_]
  3. [ json格式化工具][json]

最近才开通了微信公众号,欢迎大家关注。

20200107161707690.jpg

发表评论

表情:
评论列表 (有 0 条评论,543人围观)

还没有评论,来说两句吧...

相关阅读

    相关 json

    JSON 通常用于与服务端交换数据。 在接收服务器数据时一般是字符串。 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象 我们可

    相关 Json数据

    1、JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方

    相关 JSON

        [ JSON 使用讲解 ][JSON _]这篇文章讲解了,JSON的介绍以及使用GSON解析。今天,我们就在Android项目中使用两种方式解析JSON数据。如果你对J

    相关 Android JSON

    JSON解析 > 比起XML,JSON的主要优势在于它的体积小,在网络上传输的时候可以更省流量.但缺点在于,它的语义性较差,看起来不如xml直观. > > 解析JSON