原生Json数据的解析

前言:


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!!!


百度一下你就知道这是啥了,用来快速开发的!!

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值