2024年Android中的JSON详细讲解,2024年Android常见面试题目

最后

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  1. .endObject()

  2. .toString();

String myString = new JSONStringer().object() .key(“name”) .value(“小猪”) .endObject() .toString();

结果是一组标准格式的JSON text:{“name” : “小猪”}

其中的.object()和.endObject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。

(4)JSONTokener:

这个是系统为JSONObject和JSONArray构造器解析JSON source string的类,它可以从source string中提取数值信息。

JSONException:是JSON.org类抛出的异常信息。

下面引用一个完整的应用实例:

应用JSONObject存储Map类型数值:

view plain print ?

  1. public static JSONObject getJSON(Map map) {

  2. Iterator iter = map.entrySet().iterator();

  3. JSONObject holder = new JSONObject();

  4. while (iter.hasNext()) {

  5. Map.Entry pairs = (Map.Entry) iter.next();

  6. String key = (String) pairs.getKey();

  7. Map m = (Map) pairs.getValue();

  8. JSONObject data = new JSONObject();

  9. try {

  10. Iterator iter2 = m.entrySet().iterator();

  11. while (iter2.hasNext()) {

  12. Map.Entry pairs2 = (Map.Entry) iter2.next();

  13. data.put((String) pairs2.getKey(), (String) pairs2

  14. .getValue());

  15. }

  16. holder.put(key, data);

  17. } catch (JSONException e) {

  18. Log.e(“Transforming”, “There was an error packaging JSON”, e);

  19. }

  20. }

  21. return holder;

  22. }

public static JSONObject getJSON(Map map) { Iterator iter = map.entrySet().iterator(); JSONObject holder = new JSONObject(); while (iter.hasNext()) { Map.Entry pairs = (Map.Entry) iter.next(); String key = (String) pairs.getKey(); Map m = (Map) pairs.getValue(); JSONObject data = new JSONObject(); try { Iterator iter2 = m.entrySet().iterator(); while (iter2.hasNext()) { Map.Entry pairs2 = (Map.Entry) iter2.next(); data.put((String) pairs2.getKey(), (String) pairs2 .getValue()); } holder.put(key, data); } catch (JSONException e) { Log.e(“Transforming”, “There was an error packaging JSON”, e); } } return holder; }

下面是详细的例子:

view plain print ?

  1. import java.io.ByteArrayOutputStream;

  2. import java.io.InputStream;

  3. import java.net.*;

  4. import java.util.ArrayList;

  5. import java.util.HashMap;

  6. import java.util.List;

  7. import java.util.Map;

  8. import org.json.JSONArray;

  9. import org.json.JSONObject;

  10. import android.util.Log;

  11. public class JSON {

  12. /**

  13. * 获取"数组形式"的JSON数据,

  14. * 数据形式:[{“id”:1,“name”:“小猪”},{“id”:2,“name”:“小猫”}]

  15. * @param path  网页路径

  16. * @return  返回List

  17. * @throws Exception

  18. */

  19. public static List<Map<String, String>> getJSONArray(String path) throws Exception {

  20. String json = null;

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

  22. Map<String, String> map = null;

  23. URL url = new URL(path);

  24. HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection对象,我们可以从网络中获取网页数据.

  25. conn.setConnectTimeout(5 * 1000);   // 单位是毫秒,设置超时时间为5秒

  26. conn.setRequestMethod(“GET”);       // HttpURLConnection 是通过HTTP协议请求path路径的,所以需要设置请求方式,可以不设置,因为默认为GET

  27. if (conn.getResponseCode() == 200) {// 判断请求码是否是200码,否则失败

  28. InputStream is = conn.getInputStream(); // 获取输入流

  29. byte[] data = readStream(is);   // 把输入流转换成字符数组

  30. json = new String(data);        // 把字符数组转换成字符串

  31. //数据形式:[{“id”:1,“name”:“小猪”,“age”:22},{“id”:2,“name”:“小猫”,“age”:23}]

  32. JSONArray jsonArray = new JSONArray(json); //数据直接为一个数组形式,所以可以直接 用android提供的框架JSONArray读取JSON数据,转换成 Array

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

  34. JSONObject item = jsonArray.getJSONObject(i); //每条记录又由几个Object对象组成

  35. int id = item.getInt(“id”);     // 获取对象对应的值

  36. String name = item.getString(“name”);

  37. map = new HashMap<String, String>(); // 存放到MAP里面

  38. map.put(“id”, id + “”);

  39. map.put(“name”, name);

  40. list.add(map);

  41. }

  42. }

  43. // ***********测试数据******************

  44. for (Map<String, String> list2 : list) {

  45. String id = list2.get(“id”);

  46. String name = list2.get(“name”);

  47. Log.i(“abc”, “id:” + id + " | name:" + name);

  48. }

  49. return list;

  50. }

  51. /**

  52. * 获取"对象形式"的JSON数据,

  53. * 数据形式: {“total”:2,“success”:true,“arrayData”:[{“id”:1,“name”:“小猪”}, {“id”:2,“name”:“小猫”}]}

  54. * @param path  网页路径

  55. * @return  返回List

  56. * @throws Exception

  57. */

  58. public static List<Map<String, String>> getJSONObject(String path) throws Exception {

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

  60. Map<String, String> map = null;

  61. URL url = new URL(path);

  62. HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection对象,我们可以从网络中获取网页数据.

  63. conn.setConnectTimeout(5 * 1000);   // 单位是毫秒,设置超时时间为5秒

  64. conn.setRequestMethod(“GET”);       // HttpURLConnection 是通过HTTP协议请求path路径的,所以需要设置请求方式,可以不设置,因为默认为GET

  65. if (conn.getResponseCode() == 200) {// 判断请求码是否是200码,否则失败

  66. InputStream is = conn.getInputStream(); // 获取输入流

  67. byte[] data = readStream(is);   // 把输入流转换成字符数组

  68. String json = new String(data); // 把字符数组转换成字符串

  69. //数据形式: {“total”:2,“success”:true,“arrayData”:[{“id”:1,“name”:“小猪”}, {“id”:2,“name”:“小猫”}]}

  70. JSONObject jsonObject=new JSONObject(json);     //返回的数据形式是一个Object类型,所以可以直接转换成一个Object

  71. int total=jsonObject.getInt(“total”);

  72. Boolean success=jsonObject.getBoolean(“success”);

  73. Log.i(“abc”, “total:” + total + " | success:" + success);   //测试数据

  74. JSONArray jsonArray = jsonObject.getJSONArray(“arrayData”);// 里面有一个数组数据,可以用getJSONArray获取数组

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

  76. JSONObject item = jsonArray.getJSONObject(i); // 得到每个对象

  77. int id = item.getInt(“id”);     // 获取对象对应的值

  78. String name = item.getString(“name”);

  79. map = new HashMap<String, String>(); // 存放到MAP里面

  80. map.put(“id”, id + “”);

  81. map.put(“name”, name);

  82. list.add(map);

  83. }

  84. }

  85. // ***********测试数据******************

  86. for (Map<String, String> list2 : list) {

  87. String id = list2.get(“id”);

  88. String name = list2.get(“name”);

  89. Log.i(“abc”, “id:” + id + " | name:" + name);

  90. }

  91. return list;

  92. }

  93. /**

  94. * 获取类型复杂的JSON数据

  95. *数据形式:

  96. {“name”:“小猪”,

  97. “age”:23,

  98. “content”:{“questionsTotal”:2,

  99. “questions”: [ { “question”: “what’s your name?”, “answer”: " 小猪"},{“question”: “what’s your age”, “answer”: “23”}]

  100. }

  101. }

  102. * @param path  网页路径

  103. * @return  返回List

  104. * @throws Exception

  105. */

  106. public static List<Map<String, String>> getJSON(String path) throws Exception {

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

  108. Map<String, String> map = null;

  109. URL url = new URL(path);

  110. HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection对象,我们可以从网络中获取网页数据.

  111. conn.setConnectTimeout(5 * 1000);   // 单位是毫秒,设置超时时间为5秒

  112. conn.setRequestMethod(“GET”);       // HttpURLConnection 是通过HTTP协议请求path路径的,所以需要设置请求方式,可以不设置,因为默认为GET

  113. if (conn.getResponseCode() == 200) {// 判断请求码是否是200码,否则失败

  114. InputStream is = conn.getInputStream(); // 获取输入流

  115. byte[] data = readStream(is);   // 把输入流转换成字符数组

  116. String json = new String(data); // 把字符数组转换成字符串

  117. /*数据形式:

  118. {“name”:“小猪”,

  119. “age”:23,

  120. “content”:{“questionsTotal”:2,

  121. “questions”: [ { “question”: “what’s your name?”, “answer”: " 小猪"},{“question”: “what’s your age”, “answer”: “23”}]

  122. }

  123. }

  124. */

  125. JSONObject jsonObject=new JSONObject(json);     //返回的数据形式是一个Object类型,所以可以直接转换成一个Object

  126. String name=jsonObject.getString(“name”);

  127. int age=jsonObject.getInt(“age”);

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

欢迎大家一起交流讨论啊~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

int age=jsonObject.getInt(“age”);

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

[外链图片转存中…(img-pnQ56jhp-1714817427697)]

欢迎大家一起交流讨论啊~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android ,可以使用 Gson 或者 JsonReader 等工具类来解析 JSON 文件。下面给出两种常用的方法: 1. 使用 Gson 库进行解析: Gson 是 Google 提供的一个用于处理 JSON 数据的 Java 库,可以方便地将 JSON 数据转换为 Java 对象,也可以将 Java 对象转换为 JSON 数据。可以通过以下步骤使用 Gson 解析 JSON 文件: 1)在项的 build.gradle 文件添加 Gson 的依赖: ``` dependencies { implementation 'com.google.code.gson:gson:2.8.5' } ``` 2)定义一个 Java 类来表示 JSON 文件的数据结构,例如: ``` public class Student { private String name; private int age; private String school; // 省略 getter 和 setter 方法 } ``` 3)使用 Gson 解析 JSON 文件,例如: ``` InputStream is = context.getAssets().open("students.json"); Reader reader = new InputStreamReader(is, "UTF-8"); Gson gson = new Gson(); List<Student> students = gson.fromJson(reader, new TypeToken<List<Student>>(){}.getType()); ``` 上述代码,首先通过 context.getAssets().open() 方法获取到一个 InputStream 对象,然后通过 InputStreamReader 将其转换为 Reader 对象,并指定编码方式为 UTF-8。接着,创建一个 Gson 对象,并通过其 fromJson() 方法解析 JSON 文件,将其转换为一个 List<Student> 对象。 2. 使用 JsonReader 类进行解析: JsonReader 是 Android SDK 提供的一个类,用于解析 JSON 数据流。可以通过以下步骤使用 JsonReader 解析 JSON 文件: 1)获取 JSON 文件的 InputStream 对象,例如: ``` InputStream is = context.getAssets().open("students.json"); ``` 2)创建 JsonReader 对象,并将 InputStream 对象作为参数传入,例如: ``` JsonReader reader = new JsonReader(new InputStreamReader(is, "UTF-8")); ``` 3)开始解析 JSON 数据,例如: ``` reader.beginArray(); while (reader.hasNext()) { String name = null; int age = 0; String school = null; reader.beginObject(); while (reader.hasNext()) { String key = reader.nextName(); if (key.equals("name")) { name = reader.nextString(); } else if (key.equals("age")) { age = reader.nextInt(); } else if (key.equals("school")) { school = reader.nextString(); } else { reader.skipValue(); } } reader.endObject(); Student student = new Student(name, age, school); // 处理解析结果 } reader.endArray(); ``` 上述代码,首先通过 reader.beginArray() 方法开始解析 JSON 数组,然后通过 while 循环不断调用 reader.hasNext() 方法判断是否还有下一个元素,如果有,则通过 reader.beginObject() 方法开始解析 JSON 对象,并通过循环读取所有键值对。在读取每个键值对时,可以通过 reader.nextName() 方法获取键名,然后根据键名的不同调用不同的 reader 方法获取对应的值。最后,在读取完整个 JSON 对象后,通过 reader.endObject() 方法结束解析,并将解析结果转换为一个 Student 对象进行处理。最后,通过 reader.endArray() 方法结束解析。 需要注意的是,使用 JsonReader 解析 JSON 文件需要手动处理异常和错误情况,代码比较冗长,但可以提高解析效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值