前言:
Json数据解析在获取接口数据是经常需要用到的,现在因为这一需求,
市面上也有不少jar可以帮助我们快速的解析Json数据,
比如:谷歌的Gson,阿里巴巴的Fastson,如果你已经有了非常不错的java基础了,
基本上这篇就不用看了,这里主要讲的主要是,把json数据解析成java对象,
把json数据解析成list集合,相对复杂的json数据解析,相对特殊的数据解析!
Json数据的本质:具有特定格式的数组对象。
例如:
json_list="[{ \"name\":\"Google\", \"info\"" + ": \"廖成康\"},\n" + " { \"name\":\"Runoob\", \"info\":\"廖成文\" }]";
(此为在AS上的模拟数据)
原生数据解析的本质:如何一层一层的去解析,如何一层一层的去封装。
1.将Json数据转换成java对象最基本的,只是需要获取到Json数据之后,将解析
jsonObject后的json放入model里面就可以了,具体的实现过程如下:
数据:
/* * 简单的Json数据 * */ public String json_java="{\n" + " \"url\": \"http://qqe2.com\",\n" + " \"name\": \"欢迎使用JSON在线解析编辑器\",\n" + " \\\"imgpath\\\":\\\"http://qqe2.com\\\"\\n\" +\n" + " \" \"id\": 1,\n" + " }";
解析过程:
private void JavaJsonObject() { /* * 模拟json数据 * * */ String json=data.json_java; JsonModle jsonModle=null; try { JSONObject jsonObject = new JSONObject(json); int id=jsonObject.optInt("id"); String name=jsonObject.optString("name"); String url=jsonObject.optString("url"); String imgpath=jsonObject.optString("imgpath"); jsonModle=new JsonModle(id,name,url,imgpath); } catch (JSONException e) { e.printStackTrace(); } start_json.setText(json); transformation_json.setText(jsonModle.toString()); }
四个实现解析的方法我都使用了model,学过MVC基本上可以理解model的含义,
具体实现的程序我就不给了,简单的说,里面就是构造了一个函数
并实现了ToString方法方便展示。
2.将json数据转换为list集合,这里你可以把json数据想象成一个数组容易理解一点,
一来就可以用JsonArray,获取到后,就直接遍历出来,里面用JsonObject来承接。
具体实现如下:
数据:
public String json_list="[{ \"name\":\"Google\", \"info\"" + ": \"廖成康\"},\n" + " { \"name\":\"Runoob\", \"info\":\"廖成文\" }]";
解析过程:
private void JavaList() { LJsonModle ljsonmodel=null; List<LJsonModle> ljsonlist=new ArrayList<>(); try { JSONArray jsonArray = new JSONArray(data.json_list); for (int i=0;i<jsonArray.length();i++) { JSONObject jsonobject = jsonArray.getJSONObject(i); String name=jsonobject.optString("name"); String info=jsonobject.optString("info"); ljsonmodel=new LJsonModle(name,info); ljsonlist.add(ljsonmodel); } } catch (JSONException e) { Toast.makeText(this, "数据解析有问题!!!", Toast.LENGTH_SHORT).show(); } start_json.setText(data.json_list); transformation_json.setText(ljsonlist.toString()); }
3.相对复杂的数据解析,相对复杂是个什么概念?相对于一个JsonObject
里面有JsonArray,不想之前的两个,只有其一种,这里值得一提的是,
解析方法的最终方法是使用JsonObject!
实现方法如下:
数据:
/* * 相对复杂的数据解析 * * */ public String json_complex="{\n" + " \"name\":\"网站\",\n" + " \"num\":3,\n" + " \"sites\": [\n" + " { \"name\":\"Google\", \"info\":\"Google\" },\n" + " { \"name\":\"Runoob\", \"info\":\"Google\" },\n" + " { \"name\":\"Taobao\", \"info\":\"Google\" }\n" + " ]\n" + "}";
同样的思想:外面那一层明显是JsonObject,所以开始是必须使用JsonObject,
得到了sites后我们就需要通过JsonObject来获取到JsonArray,然后就是遍历,
遍历里面同样需要使用JsonObject来进行一一解析。
解析过程:
private void JsonComplex() { ComModel comModel=null; List<ComModel> list_com=new ArrayList(); try { /* * 进行数据的第一层解析 * * */ JSONObject jsonObject = new JSONObject(data.json_complex); String name=jsonObject.optString("name"); int num=jsonObject.optInt("num"); /* * 这里是一个纽带,连接着jsonArry和jsonObject * * */ JSONArray jsonarry=jsonObject.getJSONArray("sites"); for (int i=0;i<jsonarry.length();i++) { /* *遍历JsonArray中的JsonObject * * */ JSONObject json_objet=jsonarry.getJSONObject(i); String name_object=json_objet.optString("name"); String info_object=json_objet.optString("info"); comModel=new ComModel(name_object,info_object); list_com.add(comModel); } } catch (JSONException e) { e.printStackTrace(); } /* * 展示原始数据 * * */ start_json.setText(data.json_complex); /* * 展示转换后的数据 * * */ transformation_json.setText(list_com.toString()); }
4.进行特殊的Json数据的解析,这里的特殊是个什么意思呢?直接用例子看看
public String json_special="{\"list\": { \n" + " \"0\": { \n" + " \"title\": \"冯巩王祖贤明星惊人的身世之谜\", \n" + " \"description\": \"冯巩王祖贤明星惊人的身世之谜...\", \n" + " \"picUrl\": \"http://img521.lieqi.com/upload/picture/39/11652.jpg\", \n" + " \"url\": \"http://www.lieqi.com/read/4/11652/\" \n" + " }, \n" + " \"1\": { \n" + " \"title\": \"西西里巴勒莫唯一的地下墓穴\", \n" + " \"description\": \"西西里巴勒莫唯一的地下墓穴...\", \n" + " \"picUrl\": \"http://img521.lieqi.com/upload/picture/37/10968.jpg\", \n" + " \"url\": \"http://www.lieqi.com/read/4/10968/\" \n" + " }, \n" + " \"2\": { \n" + " \"title\": \"神秘的北纬30度为何如此诡异?\", \n" + " \"description\": \"神秘的北纬30度为何如此诡异?...\", \n" + " \"picUrl\": \"http://img521.lieqi.com/upload/picture/35/10462.jpg\", \n" + " \"url\": \"http://www.lieqi.com/read/4/10462/\" \n" + " }, \n" + " \"3\": { \n" + " \"title\": \"秦陵又出怪事了:惊天秘事内幕\", \n" + " \"description\": \"秦陵又出怪事了:惊天秘事内幕...\", \n" + " \"picUrl\": \"http://img521.lieqi.com/upload/picture/37/11017.jpg\", \n" + " \"url\": \"http://www.lieqi.com/read/4/11017/\" \n" + " }" + "}, \n" + " \"code\": 200, \n" + " \"msg\": \"ok\" \n" + "} ";
这是特殊数据解析中的一种,有key类型的,所谓的有key类型主要讲的就是有1.2.3......等等之类的。
还有一种是无key的:
/* * 没有key的数据解析 * * */ public String json_special_key="{\n" + " \"schema\": \"http://json.org/example\",\n" + " \"required\": [\n" + " \"id\",\n" + " \"name\"\n" + " ]\n" + "}";
他们的具体实现过程如下:
有key的:
private void JsonSpecial() { /* * 获取json数据 * * */ try { /* * 第一层数据的解析 * * */ JSONObject jsonObject= new JSONObject(data.json_special); String msg=jsonObject.optString("msg"); int code=jsonObject.optInt("code"); /* * 第一层解析完,第二层解析进行遍历解析 * * */ JSONObject json_list=jsonObject.getJSONObject("list"); List<SpecialModel.SpcModel> lists=new ArrayList<>(); SpecialModel special=null; SpecialModel.SpcModel spcModel = null; for (int i=0;i<json_list.length();i++) { /* * 最后一层的解析 * * */ JSONObject last_json=json_list.getJSONObject(i+""); String url=last_json.optString("url"); String picurl=last_json.optString("picurl"); String title=last_json.optString("title"); String description=last_json.optString("description"); /* *第一层封装 * */ spcModel=new SpecialModel.SpcModel(url,picurl,title,description); lists.add(spcModel); } special=new SpecialModel(code,msg,lists); /* * 展示原始数据 * * */ start_json.setText(data.json_special); /* * 展示转换后的数据 * * */ transformation_json.setText(special.toString()); } catch (JSONException e) { e.printStackTrace(); } }
这里只是封装的时候和
JSONObject last_json=json_list.getJSONObject(i+"");
这里值得注意
无key的实现过程:
void praseJson1(String str) throws Exception { org.json.JSONObject obj = new JSONObject(str); String schema = obj.getString("schema"); JSONArray array = obj.getJSONArray("required"); ArrayMap<String, String> arrayMap = new ArrayMap<>(2); for (int i = 0; i < array.length(); i++) { String value = array.getString(i); arrayMap.put(value, value); //use a map to store the values }
主要是用了map对数据进行储存!!
OK,具体的我讲完了,这里推荐一个工具Gsonformat!!!
百度一下你就知道这是啥了,用来快速开发的!!