Android中的xml、json格式数据解析

            转载请注明出处:http://blog.csdn.NET/stevenhu_223/article/details/42520233

         本博文相关的Demo下载链接:http://download.csdn.net/detail/stevenhu_223/8340451

  前言:在开发Android第三方App应用的过程中,特别是涉及到网络请求的App,都会涉及到解析后台返回的数据。而后台返回的数据无非就是两种格式,xml和json格式。如何更好的方便有效的解析这些后台返回的数据,对我们开发者来说是很重要的。接下来将介绍以下几种笔者比较常用的数据解析方式。


   一。simple-xml第三方jar包解析xml格式数据

    simple-xml是一个xml和对象互转操作工具包,官方网址为:http://simple.sourceforge.net/,jar包可以到官网上下载,笔者使用的是目前最新版本的jar包,名为simple-xml-2.7.1.jar;废话不多说了,代码才是最真实靠谱的力证。

    下面是整个Demo工程文件截图,如下图:


     该Demo主要是通过simple-xml解析assets目录中的data.xml文件内容数据,然后显示出来;

    1.data.xml文件内容如下:

  1. <?xml version=“1.0” encoding=“utf-8”?>  
  2. <resources>  
  3. <?xml version=“1.0” encoding=“utf-8”?>  
  4.     <dataContent>  
  5.         <group>  
  6.             <groupID>1</groupID>  
  7.             <groupName>第一组</groupName>  
  8.             <member>  
  9.                 <name>张三</name>  
  10.                 <age>22</age>  
  11.             </member>  
  12.             <member>  
  13.                 <name>李四</name>  
  14.                 <age>24</age>  
  15.             </member>  
  16.             <member>  
  17.                 <name>欧阳雪</name>  
  18.                 <age>18</age>  
  19.             </member>  
  20.         </group>  
  21.         <group>  
  22.             <groupID>2</groupID>  
  23.             <groupName>第二组</groupName>  
  24.             <member>  
  25.                 <name>司徒静</name>  
  26.                 <age>19</age>  
  27.             </member>  
  28.             <member>  
  29.                 <name>叶笙</name>  
  30.                 <age>26</age>  
  31.             </member>  
  32.             <member>  
  33.                 <name>杨风</name>  
  34.                 <age>25</age>  
  35.             </member>  
  36.         </group>  
  37.         <group>  
  38.             <groupID>3</groupID>  
  39.             <groupName>第三组</groupName>  
  40.             <member>  
  41.                 <name>王龙</name>  
  42.                 <age>32</age>  
  43.             </member>  
  44.             <member>  
  45.                 <name>西门胜男</name>  
  46.                 <age>21</age>  
  47.             </member>  
  48.             <member>  
  49.                 <name>张铬</name>  
  50.                 <age>45</age>  
  51.             </member>  
  52.         </group>  
  53.     </dataContent>  
  54.   
  55. </resources>  
<?xml version="1.0" encoding="utf-8"?>
<resources>
<?xml version="1.0" encoding="utf-8"?>
    <dataContent>
        <group>
            <groupID>1</groupID>
            <groupName>第一组</groupName>
            <member>
                <name>张三</name>
                <age>22</age>
            </member>
            <member>
                <name>李四</name>
                <age>24</age>
            </member>
            <member>
                <name>欧阳雪</name>
                <age>18</age>
            </member>
        </group>
        <group>
            <groupID>2</groupID>
            <groupName>第二组</groupName>
            <member>
                <name>司徒静</name>
                <age>19</age>
            </member>
            <member>
                <name>叶笙</name>
                <age>26</age>
            </member>
            <member>
                <name>杨风</name>
                <age>25</age>
            </member>
        </group>
        <group>
            <groupID>3</groupID>
            <groupName>第三组</groupName>
            <member>
                <name>王龙</name>
                <age>32</age>
            </member>
            <member>
                <name>西门胜男</name>
                <age>21</age>
            </member>
            <member>
                <name>张铬</name>
                <age>45</age>
            </member>
        </group>
    </dataContent>

</resources>
   通过上面的文件内容,我们知道,这个文件内容主要有三组数据,每组数据有个三个成员组,每个成员组都有名字和年龄这两个子元素。Demo中将这些解析出来内容通过ExpandableListView显示出来。

  2.主页面MainActivity代码如下:

  1. package com.steven.android.simple.xml.activity;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.util.regex.Matcher;  
  8. import java.util.regex.Pattern;  
  9. import org.simpleframework.xml.core.Persister;  
  10. import android.app.Activity;  
  11. import android.os.Bundle;  
  12. import android.text.TextUtils;  
  13. import android.util.Log;  
  14. import android.view.Menu;  
  15. import android.widget.ExpandableListView;  
  16. import com.steven.android.simple.xml.adapter.ExpandAdapter;  
  17. import com.steven.android.simple.xml.parse.DataParseResponse;  
  18. /** 
  19.  * 描述:主页面 
  20.  * @author stevenhu223 
  21.  * 
  22.  */  
  23. public class MainActivity extends Activity {  
  24.   
  25.     private  final String TAG = “MainActivity”;  
  26.     private ExpandableListView mExpandableListView;  
  27.     private ExpandAdapter mAdapter;  
  28.   
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.         mExpandableListView = (ExpandableListView) findViewById(R.id.expanlist_content);  
  34.         try {  
  35.             matchAndParseData();  
  36.         } catch (Exception e) {  
  37.             // TODO Auto-generated catch block  
  38.             e.printStackTrace();  
  39.         }  
  40.     }  
  41.   
  42.     @Override  
  43.     public boolean onCreateOptionsMenu(Menu menu) {  
  44.         // Inflate the menu; this adds items to the action bar if it is present.  
  45.         getMenuInflater().inflate(R.menu.main, menu);  
  46.         return true;  
  47.     }  
  48.   
  49.     /** 
  50.      * 匹配获取和解析xml文件内容 
  51.      * @throws Exception 
  52.      */  
  53.     private void matchAndParseData() throws Exception {  
  54.         InputStream inputStream = getResources().getAssets().open(”data.xml”);  
  55.         String dataContent = convertStreamToString(inputStream);  
  56.         String content = ”“;  
  57.         //正则表达式匹配  
  58.         Pattern DATA_PATTERN= Pattern.compile(”[\\S\\s]*(<dataContent>[\\s\\S]*</dataContent>)[\\s\\S]*”);  
  59.         Matcher matcher = DATA_PATTERN.matcher(dataContent);  
  60.         if (matcher.matches()) {  
  61.             //获取包含dataContent元素的内容  
  62.             content = matcher.group(1);  
  63.         }   
  64.         if (!TextUtils.isEmpty(content)) {  
  65.             DataParseResponse dataResponse = parseToBean(DataParseResponse.class, content);  
  66.             mAdapter = new ExpandAdapter(this, dataResponse.mGroupEntities);  
  67.             mExpandableListView.setAdapter(mAdapter);  
  68.         }  
  69.     }  
  70.   
  71.     /** 
  72.      * 将xml文件内容解析成实体类 
  73.      * @param type 
  74.      * @param data 
  75.      * @return 
  76.      */  
  77.     private <T> T parseToBean(Class<T> type , String data) {  
  78.   
  79.         try {  
  80.             return new Persister().read(type, data, false);  
  81.         } catch (Exception e) {  
  82.             Log.e(TAG, ”parse Data error”, e);  
  83.             throw new RuntimeException(e);  
  84.         }  
  85.       
  86.     }  
  87.       
  88.     /** 
  89.      * 输入流转字符串 
  90.      * @param is 
  91.      * @return 
  92.      */  
  93.     public String convertStreamToString(InputStream is) {  
  94.   
  95.         BufferedReader reader = new BufferedReader(new InputStreamReader(is));  
  96.         StringBuilder sb = new StringBuilder();  
  97.         String line = null;  
  98.         try {  
  99.             while ((line = reader.readLine()) != null) {  
  100.                 sb.append(line);  
  101.             }  
  102.         } catch (IOException e) {  
  103.             e.printStackTrace();  
  104.         } finally {  
  105.             try {  
  106.                 is.close();  
  107.             } catch (IOException e) {  
  108.                 e.printStackTrace();  
  109.             }  
  110.         }  
  111.         return sb.toString();  
  112.   
  113.     }  
  114. }  
package com.steven.android.simple.xml.activity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.simpleframework.xml.core.Persister;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.widget.ExpandableListView;
import com.steven.android.simple.xml.adapter.ExpandAdapter;
import com.steven.android.simple.xml.parse.DataParseResponse;
/**
 * 描述:主页面
 * @author stevenhu223
 *
 */
public class MainActivity extends Activity {

    private  final String TAG = "MainActivity";
    private ExpandableListView mExpandableListView;
    private ExpandAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mExpandableListView = (ExpandableListView) findViewById(R.id.expanlist_content);
        try {
            matchAndParseData();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * 匹配获取和解析xml文件内容
     * @throws Exception
     */
    private void matchAndParseData() throws Exception {
        InputStream inputStream = getResources().getAssets().open("data.xml");
        String dataContent = convertStreamToString(inputStream);
        String content = "";
        //正则表达式匹配
        Pattern DATA_PATTERN= Pattern.compile("[\\S\\s]*(<dataContent>[\\s\\S]*</dataContent>)[\\s\\S]*");
        Matcher matcher = DATA_PATTERN.matcher(dataContent);
        if (matcher.matches()) {
            //获取包含dataContent元素的内容
            content = matcher.group(1);
        } 
        if (!TextUtils.isEmpty(content)) {
            DataParseResponse dataResponse = parseToBean(DataParseResponse.class, content);
            mAdapter = new ExpandAdapter(this, dataResponse.mGroupEntities);
            mExpandableListView.setAdapter(mAdapter);
        }
    }

    /**
     * 将xml文件内容解析成实体类
     * @param type
     * @param data
     * @return
     */
    private <T> T parseToBean(Class<T> type , String data) {

        try {
            return new Persister().read(type, data, false);
        } catch (Exception e) {
            Log.e(TAG, "parse Data error", e);
            throw new RuntimeException(e);
        }

    }

    /**
     * 输入流转字符串
     * @param is
     * @return
     */
    public String convertStreamToString(InputStream is) {

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();

    }
}
  上面的代码中,parseToBean方法的功能就是将xml格式数据解析成对应的实体类,Persister类是simple-xml包中的类。通过调用parseToBean函数将xml内容数据解析封装成DataParseResponse对象,接下来我们看看DataParseResponse的代码。

   3.DataParseResponse.Java文件代码如下:

  1. package com.steven.android.simple.xml.parse;  
  2.   
  3. import org.simpleframework.xml.ElementList;  
  4. import org.simpleframework.xml.Root;  
  5.   
  6. import com.steven.android.simple.xml.entity.GroupEntity;  
  7.   
  8. import java.util.List;  
  9.   
  10. /** 
  11.  *  描述:解析数据响应类 
  12.  * 此处的dataContent要对应xml文件中的dataContent元素 
  13.  * @author stenvenhu223 
  14.  * 
  15.  */  
  16. @Root(name = “dataContent”)  
  17. public class DataParseResponse {  
  18.     @ElementList(inline=true,required=false)  
  19.     public List<GroupEntity> mGroupEntities;  
  20. }  
package com.steven.android.simple.xml.parse;

import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

import com.steven.android.simple.xml.entity.GroupEntity;

import java.util.List;

/**
 *  描述:解析数据响应类
 * 此处的dataContent要对应xml文件中的dataContent元素
 * @author stenvenhu223
 *
 */
@Root(name = "dataContent")
public class DataParseResponse {
    @ElementList(inline=true,required=false)
    public List<GroupEntity> mGroupEntities;
}
  通过上面的代码我们知道,simple-xml包解析xml格式数据成实体类时,实体类中对应需要解析的xml格式数据元素名的注解是非常重要的。这些注释都是来自simple-xml包的。DataParseResponse类中的@Root(name = “NewDataSet”)注解表示的是从xml数据根元素dataContent。由于group元素在根元素dataContent中是以数组的形式存在的,所以这里的集合mGroupEntities就表示解析的group元素数组内容集合,必然的它的注解也应为@ElementList(inline=true,required=false)。接下来,我们看看GroupEntity实体类的代码。

 4.GroupEntity.java文件代码如下:

  1. package com.steven.android.simple.xml.entity;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.simpleframework.xml.Element;  
  6. import org.simpleframework.xml.ElementList;  
  7. import org.simpleframework.xml.Root;  
  8. @Root(name=“group”)  
  9. public class GroupEntity {  
  10.     @Element(name=“groupID”public String groupId;  
  11.     @Element(name=“groupName”public String groupName;  
  12.     @ElementList(inline=true,required=false)  
  13.     public List<MemberEntity> memberEntities;  
  14.       
  15. }  
package com.steven.android.simple.xml.entity;

import java.util.List;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
@Root(name="group")
public class GroupEntity {
    @Element(name="groupID") public String groupId;
    @Element(name="groupName") public String groupName;
    @ElementList(inline=true,required=false)
    public List<MemberEntity> memberEntities;

}
   代码中,@Root(name=”group”)对应的是xml文件中的group元素。@Element(name=”groupID”)注解对应的是group元素的子元素groupID,@Element(name=”groupName”)注解对应的是group元素的子元素groupName。而member元素在group元素中是以数组形式存在的,所以它在GroupEntity中必然也以集合的形式存在,注解也应该为@ElementList(inline=true,required=false);接着,我们解析看看实体类MemberEntity的代码。

   5.MemberEntity.java文件代码如下:

  1. @Root(name=“member”)  
  2. public class MemberEntity {  
  3.     @Element(required=falsepublic String name;  
  4.     @Element(required=falsepublic String age;  
  5. }  
@Root(name="member")
public class MemberEntity {
    @Element(required=false) public String name;
    @Element(required=false) public String age;
}
   MemberEntity代码中的代码注释这里就不多说了,原理和其他的实体类是一致的。

   既然要把解析出来的数据通过ExpandableListView显示出来,那么我们就需要创建ExpandableListView对应的适配器,然后填充解析后的实体类形式数据。我们来看看适配器ExpandAdapter的代码。

   6.ExpandAdapter.java文件代码如下:

  1. package com.steven.android.simple.xml.adapter;  
  2.   
  3. import java.util.List;  
  4. import android.content.Context;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.BaseExpandableListAdapter;  
  9. import android.widget.TextView;  
  10. import com.steven.android.simple.xml.activity.R;  
  11. import com.steven.android.simple.xml.custom.ViewHolder;  
  12. import com.steven.android.simple.xml.entity.GroupEntity;  
  13. import com.steven.android.simple.xml.entity.MemberEntity;  
  14.   
  15. public class ExpandAdapter extends BaseExpandableListAdapter{  
  16.   
  17.     private List<GroupEntity> mGroupEntities;  
  18.     private LayoutInflater mInflater;  
  19.       
  20.     public  ExpandAdapter(Context context, List<GroupEntity> list) {  
  21.         mGroupEntities = list;  
  22.         mInflater = LayoutInflater.from(context);  
  23.     }  
  24.       
  25.     @Override  
  26.     public Object getChild(int groupPosition, int childPosition) {  
  27.         // TODO Auto-generated method stub  
  28.         return mGroupEntities.get(groupPosition).memberEntities.get(childPosition);  
  29.     }  
  30.   
  31.     @Override  
  32.     public long getChildId(int groupPosition, int childPosition) {  
  33.         // TODO Auto-generated method stub  
  34.         return childPosition;  
  35.     }  
  36.   
  37.     @Override  
  38.     public View getChildView(int groupPosition, int childPosition,  
  39.             boolean isLastChild, View convertView, ViewGroup parent) {  
  40.         if (convertView == null) {  
  41.             convertView = mInflater.inflate(R.layout.item_member_content, parent, false);  
  42.         }  
  43.         TextView text_member_content = ViewHolder.get(convertView, R.id.text_member_content);  
  44.         MemberEntity entity = (MemberEntity)getChild(groupPosition, childPosition);  
  45.         text_member_content.setText(entity.name);  
  46.         return convertView;  
  47.     }  
  48.   
  49.     @Override  
  50.     public int getChildrenCount(int groupPosition) {  
  51.         // TODO Auto-generated method stub  
  52.         return mGroupEntities.get(groupPosition).memberEntities.size();  
  53.     }  
  54.   
  55.     @Override  
  56.     public Object getGroup(int groupPosition) {  
  57.         // TODO Auto-generated method stub  
  58.         return mGroupEntities.get(groupPosition);  
  59.     }  
  60.   
  61.     @Override  
  62.     public int getGroupCount() {  
  63.         // TODO Auto-generated method stub  
  64.         return mGroupEntities.size();  
  65.     }  
  66.   
  67.     @Override  
  68.     public long getGroupId(int groupPosition) {  
  69.         // TODO Auto-generated method stub  
  70.         return groupPosition;  
  71.     }  
  72.   
  73.     @Override  
  74.     public View getGroupView(int groupPosition, boolean isExpanded,  
  75.             View convertView, ViewGroup parent) {  
  76.         if (convertView == null) {  
  77.             convertView =  mInflater.inflate(R.layout.item_group_content, parent, false);  
  78.         }  
  79.         TextView text_group_cotent = ViewHolder.get(convertView, R.id.text_group_content);  
  80.         GroupEntity entity = (GroupEntity)getGroup(groupPosition);  
  81.         text_group_cotent.setText(entity.groupName);  
  82.         return convertView;  
  83.     }  
  84.   
  85.     @Override  
  86.     public boolean hasStableIds() {  
  87.         // TODO Auto-generated method stub  
  88.         return true;  
  89.     }  
  90.   
  91.     @Override  
  92.     public boolean isChildSelectable(int groupPosition, int childPosition) {  
  93.         // TODO Auto-generated method stub  
  94.         return true;  
  95.     }  
  96.   
  97. }  
package com.steven.android.simple.xml.adapter;

import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
import com.steven.android.simple.xml.activity.R;
import com.steven.android.simple.xml.custom.ViewHolder;
import com.steven.android.simple.xml.entity.GroupEntity;
import com.steven.android.simple.xml.entity.MemberEntity;

public class ExpandAdapter extends BaseExpandableListAdapter{

    private List<GroupEntity> mGroupEntities;
    private LayoutInflater mInflater;

    public  ExpandAdapter(Context context, List<GroupEntity> list) {
        mGroupEntities = list;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return mGroupEntities.get(groupPosition).memberEntities.get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item_member_content, parent, false);
        }
        TextView text_member_content = ViewHolder.get(convertView, R.id.text_member_content);
        MemberEntity entity = (MemberEntity)getChild(groupPosition, childPosition);
        text_member_content.setText(entity.name);
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        // TODO Auto-generated method stub
        return mGroupEntities.get(groupPosition).memberEntities.size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        // TODO Auto-generated method stub
        return mGroupEntities.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        // TODO Auto-generated method stub
        return mGroupEntities.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        // TODO Auto-generated method stub
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView =  mInflater.inflate(R.layout.item_group_content, parent, false);
        }
        TextView text_group_cotent = ViewHolder.get(convertView, R.id.text_group_content);
        GroupEntity entity = (GroupEntity)getGroup(groupPosition);
        text_group_cotent.setText(entity.groupName);
        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return true;
    }

}
  所以,当在MainActivity中通过调用parseToBean方法完成解析xml数据后,将解析得到的实体类填充到适配器中,然后通过ExpandableListView显示出来。工程中的ViewHolder是自定义类,它的存在,是为了避免在Adapter类中频繁地创建ViewHolder。

 7.ViewHolder.java文件代码如下:

  1. package com.steven.android.sax.xml.custom;  
  2.   
  3. import android.util.SparseArray;  
  4. import android.view.View;  
  5.   
  6. public class ViewHolder {  
  7.     @SuppressWarnings(“unchecked”)  
  8.     public static <T extends View> T get(View view, int id) {  
  9.         SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();  
  10.         if (viewHolder == null) {  
  11.             viewHolder = new SparseArray<View>();  
  12.             view.setTag(viewHolder);  
  13.         }  
  14.         View childView = viewHolder.get(id);  
  15.         if (childView == null) {  
  16.             childView = view.findViewById(id);  
  17.             viewHolder.put(id, childView);  
  18.         }  
  19.         return (T) childView;  
  20.     }  
  21. }  
package com.steven.android.sax.xml.custom;

import android.util.SparseArray;
import android.view.View;

public class ViewHolder {
    @SuppressWarnings("unchecked")
    public static <T extends View> T get(View view, int id) {
        SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
        if (viewHolder == null) {
            viewHolder = new SparseArray<View>();
            view.setTag(viewHolder);
        }
        View childView = viewHolder.get(id);
        if (childView == null) {
            childView = view.findViewById(id);
            viewHolder.put(id, childView);
        }
        return (T) childView;
    }
}

  

 二。SAX解析xml格式数据。

   前面介绍了如何借助simple-xml包解析xml数据。这里,将要介绍不需要通过第三方jar包,如何通过SAX有效地去解析xml数据。关于SAX的介绍,笔者在这里就不再累赘了,相信很多程序猿都接触过了。

   下面是整个Demo工程文件截图,如下图:



    该工程代码和simple-xml工程代码一样,也是将解析的xml数据通过ExpandableListView显示出来。assets目录中的data.xml文件内容、ExpandAdapter类、相关文件布局和simple-xml工程差不多都是一样的,这里就不贴出来了。不过实体类是有变化的, 不再是公共成员变量形式存在,而是私有变量形式存在,以set、get形式赋值和取值。下面看看实体类的代码。

   1.GroupEntity.java文件代码如下:

  1. package com.steven.android.sax.xml.entity;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class GroupEntity {  
  7.     private String groupId;  
  8.     private String groupName;  
  9.     private List<MemberEntity> memberEntities = new ArrayList<MemberEntity>();;  
  10.   
  11.     public String getGroupId() {  
  12.         return groupId;  
  13.     }  
  14.   
  15.     public void setGroupId(String groupId) {  
  16.         this.groupId = groupId;  
  17.     }  
  18.   
  19.     public String getGroupName() {  
  20.         return groupName;  
  21.     }  
  22.   
  23.     public void setGroupName(String groupName) {  
  24.         this.groupName = groupName;  
  25.     }  
  26.   
  27.     public List<MemberEntity> getMemberEntities() {  
  28.         return memberEntities;  
  29.     }  
  30.   
  31.     public void setMemberEntities(List<MemberEntity> memberEntities) {  
  32.         this.memberEntities = memberEntities;  
  33.     }  
  34.   
  35. }  
package com.steven.android.sax.xml.entity;

import java.util.ArrayList;
import java.util.List;

public class GroupEntity {
    private String groupId;
    private String groupName;
    private List<MemberEntity> memberEntities = new ArrayList<MemberEntity>();;

    public String getGroupId() {
        return groupId;
    }

    public void setGroupId(String groupId) {
        this.groupId = groupId;
    }

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    public List<MemberEntity> getMemberEntities() {
        return memberEntities;
    }

    public void setMemberEntities(List<MemberEntity> memberEntities) {
        this.memberEntities = memberEntities;
    }

}
   2.MemberEntity.java文件代码如下:

  1. package com.steven.android.sax.xml.entity;  
  2.   
  3. public class MemberEntity {  
  4.   
  5.     private String name;  
  6.     private String age;  
  7.   
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.   
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.   
  16.     public String getAge() {  
  17.         return age;  
  18.     }  
  19.   
  20.     public void setAge(String age) {  
  21.         this.age = age;  
  22.     }  
  23.   
  24. }  
package com.steven.android.sax.xml.entity;

public class MemberEntity {

    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

}
   接下来,我们看看主页面的代码。

  3.MainActivity.java文件代码如下:

  1. package com.steven.android.sax.xml.activity;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.util.List;  
  8. import java.util.regex.Matcher;  
  9. import java.util.regex.Pattern;  
  10. import android.app.Activity;  
  11. import android.os.Bundle;  
  12. import android.text.TextUtils;  
  13. import android.view.Menu;  
  14. import android.widget.ExpandableListView;  
  15. import com.steven.android.sax.xml.adapter.ExpandAdapter;  
  16. import com.steven.android.sax.xml.entity.GroupEntity;  
  17. import com.steven.android.sax.xml.handler.DataParseHandler;  
  18. import com.steven.android.sax.xml.util.XmlParserUtil;  
  19. /** 
  20.  * 描述:主页面 
  21.  * @author stevenhu223 
  22.  * 
  23.  */  
  24. public class MainActivity extends Activity {  
  25.       
  26.     private ExpandableListView mExpandableListView;  
  27.     private ExpandAdapter mAdapter;  
  28.       
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.         mExpandableListView = (ExpandableListView) findViewById(R.id.expanlist_content);  
  34.         try {  
  35.             matchAndParseXmlData();  
  36.         } catch (Exception e) {  
  37.             // TODO Auto-generated catch block  
  38.             e.printStackTrace();  
  39.         }  
  40.     }  
  41.   
  42.     @Override  
  43.     public boolean onCreateOptionsMenu(Menu menu) {  
  44.         // Inflate the menu; this adds items to the action bar if it is present.  
  45.         getMenuInflater().inflate(R.menu.main, menu);  
  46.         return true;  
  47.     }  
  48.   
  49.     /** 
  50.      * 匹配获取和解析xml文件内容 
  51.      * @throws Exception 
  52.      */  
  53.     private void matchAndParseXmlData() throws Exception {  
  54.         InputStream inputStream = getResources().getAssets().open(”data.xml”);  
  55.         String dataContent = convertStreamToString(inputStream);  
  56.         String content = ”“;  
  57.         Pattern DATA_PATTERN= Pattern.compile(”[\\S\\s]*(<dataContent>[\\s\\S]*</dataContent>)[\\s\\S]*”);  
  58.         Matcher matcher = DATA_PATTERN.matcher(dataContent);  
  59.         if (matcher.matches()) {  
  60.             content = matcher.group(1);  
  61.         }   
  62.         if (!TextUtils.isEmpty(content)) {  
  63.             DataParseHandler handler = new DataParseHandler();  
  64.             XmlParserUtil.parserXMLByHandler(handler, content);  
  65.             List<GroupEntity> mGroupEntities = handler.getResult();  
  66.             mAdapter = new ExpandAdapter(this, mGroupEntities);  
  67.             mExpandableListView.setAdapter(mAdapter);  
  68.         }  
  69.     }  
  70.       
  71.     /** 
  72.      * 输入流转字符串 
  73.      * @param is 
  74.      * @return 
  75.      */  
  76.     public String convertStreamToString(InputStream is) {  
  77.   
  78.         BufferedReader reader = new BufferedReader(new InputStreamReader(is));  
  79.         StringBuilder sb = new StringBuilder();  
  80.         String line = null;  
  81.         try {  
  82.             while ((line = reader.readLine()) != null) {  
  83.                 sb.append(line);  
  84.             }  
  85.         } catch (IOException e) {  
  86.             e.printStackTrace();  
  87.         } finally {  
  88.             try {  
  89.                 is.close();  
  90.             } catch (IOException e) {  
  91.                 e.printStackTrace();  
  92.             }  
  93.         }  
  94.         return sb.toString();  
  95.   
  96.     }  
  97.       
  98. }  
package com.steven.android.sax.xml.activity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.widget.ExpandableListView;
import com.steven.android.sax.xml.adapter.ExpandAdapter;
import com.steven.android.sax.xml.entity.GroupEntity;
import com.steven.android.sax.xml.handler.DataParseHandler;
import com.steven.android.sax.xml.util.XmlParserUtil;
/**
 * 描述:主页面
 * @author stevenhu223
 *
 */
public class MainActivity extends Activity {

    private ExpandableListView mExpandableListView;
    private ExpandAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mExpandableListView = (ExpandableListView) findViewById(R.id.expanlist_content);
        try {
            matchAndParseXmlData();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * 匹配获取和解析xml文件内容
     * @throws Exception
     */
    private void matchAndParseXmlData() throws Exception {
        InputStream inputStream = getResources().getAssets().open("data.xml");
        String dataContent = convertStreamToString(inputStream);
        String content = "";
        Pattern DATA_PATTERN= Pattern.compile("[\\S\\s]*(<dataContent>[\\s\\S]*</dataContent>)[\\s\\S]*");
        Matcher matcher = DATA_PATTERN.matcher(dataContent);
        if (matcher.matches()) {
            content = matcher.group(1);
        } 
        if (!TextUtils.isEmpty(content)) {
            DataParseHandler handler = new DataParseHandler();
            XmlParserUtil.parserXMLByHandler(handler, content);
            List<GroupEntity> mGroupEntities = handler.getResult();
            mAdapter = new ExpandAdapter(this, mGroupEntities);
            mExpandableListView.setAdapter(mAdapter);
        }
    }

    /**
     * 输入流转字符串
     * @param is
     * @return
     */
    public String convertStreamToString(InputStream is) {

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();

    }

}
  在MainActivity中,matchAndParseData方法实现SAX解析xml数据。SAX解析xml数据,其实重点是如何创建继承DefaultHandler2的类。我们来看看工程中创建的DataParseHandler类。

  4.DataParseHandler.java文件代码如下:

  1. package com.steven.android.sax.xml.handler;  
  2.   
  3. import java.util.ArrayList;  
  4. import org.xml.sax.Attributes;  
  5. import org.xml.sax.InputSource;  
  6. import org.xml.sax.SAXException;  
  7. import org.xml.sax.ext.DefaultHandler2;  
  8. import com.steven.android.sax.xml.entity.GroupEntity;  
  9. import com.steven.android.sax.xml.entity.MemberEntity;  
  10.   
  11. /** 
  12.  * 描述:data.xml文件内容解析handler</br> 
  13.  *  
  14.  * @author stevenhu223 
  15.  */  
  16. public class DataParseHandler extends DefaultHandler2 {  
  17.   
  18.     InputSource mInputSource;  
  19.     String nodeName;  
  20.     public GroupEntity groupEntity;  
  21.     public MemberEntity memberEntity;  
  22.     public ArrayList<GroupEntity> groupEntities;  
  23.   
  24.     StringBuffer cData;// 某一段cdata的值  
  25.   
  26.     public DataParseHandler() {  
  27.         cData = new StringBuffer();  
  28.         groupEntities = new ArrayList<GroupEntity>();  
  29.     }  
  30.   
  31.     @Override  
  32.     public void characters(char[] ch, int start, int length)  
  33.             throws SAXException {  
  34.   
  35.         if (nodeName != null && nodeName.equals(“groupID”)) {  
  36.             String data = new String(ch, start, length);  
  37.             cData.append(data);  
  38.             super.characters(ch, start, length);  
  39.         } else if (nodeName != null && nodeName.equals(“groupName”)) {  
  40.             String data = new String(ch, start, length);  
  41.             cData.append(data);  
  42.             super.characters(ch, start, length);  
  43.         } else if (nodeName != null && nodeName.equals(“name”)) {  
  44.             String data = new String(ch, start, length);  
  45.             cData.append(data);  
  46.             super.characters(ch, start, length);  
  47.         } else if (nodeName != null && nodeName.equals(“age”)) {  
  48.             String data = new String(ch, start, length);  
  49.             cData.append(data);  
  50.             super.characters(ch, start, length);  
  51.         }  
  52.     }  
  53.   
  54.     @Override  
  55.     public void startElement(String uri, String localName, String name,  
  56.             Attributes atts) throws SAXException {  
  57.         nodeName = localName;  
  58.         if (localName.equals(“group”)) {  
  59.             //读到group开始元素时创建GroupEntity对象  
  60.             groupEntity = new GroupEntity();  
  61.         } else if (localName.equals(“member”)){  
  62.             //读到member开始元素时创建MemberEntity对象  
  63.             memberEntity = new MemberEntity();  
  64.         } else if (localName.equals(“groupID”)) {  
  65.             startCDATA();  
  66.         } else if (localName.equals(“groupName”)) {  
  67.             startCDATA();  
  68.         } else if (localName.equals(“name”)) {  
  69.             startCDATA();  
  70.         } else if (localName.equals(“age”)) {  
  71.             startCDATA();  
  72.         }   
  73.   
  74.     }  
  75.   
  76.     @Override  
  77.     public void endElement(String uri, String localName, String name)  
  78.             throws SAXException {  
  79.         nodeName = null;  
  80.         if (localName.equals(“group”)) {  
  81.             //读到group结束元素时添加GroupEntity对象添加到集合  
  82.             groupEntities.add(groupEntity);  
  83.         } else if (localName.equals(“member”)) {  
  84.             //读到member结束元素时将MemberEntity对象添加到集合  
  85.             groupEntity.getMemberEntities().add(memberEntity);  
  86.         } else if (localName.equals(“groupID”)) {  
  87.             endCDATA();  
  88.             groupEntity.setGroupId(getCDataString());  
  89.         } else if (localName.equals(“groupName”)) {  
  90.             endCDATA();  
  91.             groupEntity.setGroupName(getCDataString());  
  92.         } else if (localName.equals(“name”)) {  
  93.             endCDATA();  
  94.             memberEntity.setName(getCDataString());  
  95.         } else if (localName.equals(“age”)) {  
  96.             endCDATA();  
  97.             memberEntity.setAge(getCDataString());  
  98.         }   
  99.     }  
  100.   
  101.     private String getCDataString() {  
  102.         return cData.toString();  
  103.     }  
  104.   
  105.     // 重新开始CDATA  
  106.     @Override  
  107.     public void startCDATA() throws SAXException {  
  108.         if (cData == null) {  
  109.             cData = new StringBuffer();  
  110.         } else {  
  111.             cData.delete(0, cData.length());  
  112.         }  
  113.         super.startCDATA();  
  114.     }  
  115.   
  116.     @Override  
  117.     public void endCDATA() throws SAXException {  
  118.   
  119.         super.endCDATA();  
  120.     }  
  121.   
  122.     public ArrayList<GroupEntity> getResult() {  
  123.         return groupEntities;  
  124.     }  
  125.   
  126. }  
package com.steven.android.sax.xml.handler;

import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.ext.DefaultHandler2;
import com.steven.android.sax.xml.entity.GroupEntity;
import com.steven.android.sax.xml.entity.MemberEntity;

/**
 * 描述:data.xml文件内容解析handler</br>
 * 
 * @author stevenhu223
 */
public class DataParseHandler extends DefaultHandler2 {

    InputSource mInputSource;
    String nodeName;
    public GroupEntity groupEntity;
    public MemberEntity memberEntity;
    public ArrayList<GroupEntity> groupEntities;

    StringBuffer cData;// 某一段cdata的值

    public DataParseHandler() {
        cData = new StringBuffer();
        groupEntities = new ArrayList<GroupEntity>();
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {

        if (nodeName != null && nodeName.equals("groupID")) {
            String data = new String(ch, start, length);
            cData.append(data);
            super.characters(ch, start, length);
        } else if (nodeName != null && nodeName.equals("groupName")) {
            String data = new String(ch, start, length);
            cData.append(data);
            super.characters(ch, start, length);
        } else if (nodeName != null && nodeName.equals("name")) {
            String data = new String(ch, start, length);
            cData.append(data);
            super.characters(ch, start, length);
        } else if (nodeName != null && nodeName.equals("age")) {
            String data = new String(ch, start, length);
            cData.append(data);
            super.characters(ch, start, length);
        }
    }

    @Override
    public void startElement(String uri, String localName, String name,
            Attributes atts) throws SAXException {
        nodeName = localName;
        if (localName.equals("group")) {
            //读到group开始元素时创建GroupEntity对象
            groupEntity = new GroupEntity();
        } else if (localName.equals("member")){
            //读到member开始元素时创建MemberEntity对象
            memberEntity = new MemberEntity();
        } else if (localName.equals("groupID")) {
            startCDATA();
        } else if (localName.equals("groupName")) {
            startCDATA();
        } else if (localName.equals("name")) {
            startCDATA();
        } else if (localName.equals("age")) {
            startCDATA();
        } 

    }

    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {
        nodeName = null;
        if (localName.equals("group")) {
            //读到group结束元素时添加GroupEntity对象添加到集合
            groupEntities.add(groupEntity);
        } else if (localName.equals("member")) {
            //读到member结束元素时将MemberEntity对象添加到集合
            groupEntity.getMemberEntities().add(memberEntity);
        } else if (localName.equals("groupID")) {
            endCDATA();
            groupEntity.setGroupId(getCDataString());
        } else if (localName.equals("groupName")) {
            endCDATA();
            groupEntity.setGroupName(getCDataString());
        } else if (localName.equals("name")) {
            endCDATA();
            memberEntity.setName(getCDataString());
        } else if (localName.equals("age")) {
            endCDATA();
            memberEntity.setAge(getCDataString());
        } 
    }

    private String getCDataString() {
        return cData.toString();
    }

    // 重新开始CDATA
    @Override
    public void startCDATA() throws SAXException {
        if (cData == null) {
            cData = new StringBuffer();
        } else {
            cData.delete(0, cData.length());
        }
        super.startCDATA();
    }

    @Override
    public void endCDATA() throws SAXException {

        super.endCDATA();
    }

    public ArrayList<GroupEntity> getResult() {
        return groupEntities;
    }

}
   通过 DataParseHandler的getResult()方法可以获取到解析xml数据成功后的实体集合。在创xml解析数据对应的DataParseHandler类后,还需要将该类的对象和需要解析的xml数据关联起来,于是就有了XmlParserUtil工具类。

  5.XmlParserUtil.java文件代码如下:

  1. package com.steven.android.sax.xml.util;  
  2.   
  3. import java.io.StringReader;  
  4.   
  5. import javax.xml.parsers.SAXParserFactory;  
  6. import org.xml.sax.InputSource;  
  7. import org.xml.sax.XMLReader;  
  8. import org.xml.sax.ext.DefaultHandler2;  
  9. /** 
  10.  *  描述:Sax解析工具类 
  11.  * @author stevenhu223 
  12.  * 
  13.  */  
  14. public class XmlParserUtil {  
  15.   
  16.     /** 
  17.      * 关联DefaultHandler2和xml数据进行解析 
  18.      * @param handler 
  19.      * @param xml 
  20.      */  
  21.     public static void parserXMLByHandler(DefaultHandler2 handler,String xml) {  
  22.         XMLReader xmlReader;  
  23.         InputSource input = getInputSouceByString(xml);  
  24.         try {  
  25.             SAXParserFactory s = SAXParserFactory.newInstance();  
  26.             xmlReader = s.newSAXParser().getXMLReader();  
  27.             xmlReader.setContentHandler(handler);  
  28.             xmlReader.parse(input);  
  29.   
  30.         } catch (Exception e) {  
  31.   
  32.             e.printStackTrace();  
  33.         }  
  34.     }  
  35.       
  36.     /** 
  37.      * 通过字符串获取流 
  38.      * @param xmlStr 
  39.      * @return 
  40.      */  
  41.     public static InputSource getInputSouceByString(String xmlStr) {  
  42.         StringReader sr = new StringReader(xmlStr);  
  43.         InputSource is = new InputSource(sr);  
  44.         return is;  
  45.   
  46.     }  
  47.       
  48. }  
package com.steven.android.sax.xml.util;

import java.io.StringReader;

import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.DefaultHandler2;
/**
 *  描述:Sax解析工具类
 * @author stevenhu223
 *
 */
public class XmlParserUtil {

    /**
     * 关联DefaultHandler2和xml数据进行解析
     * @param handler
     * @param xml
     */
    public static void parserXMLByHandler(DefaultHandler2 handler,String xml) {
        XMLReader xmlReader;
        InputSource input = getInputSouceByString(xml);
        try {
            SAXParserFactory s = SAXParserFactory.newInstance();
            xmlReader = s.newSAXParser().getXMLReader();
            xmlReader.setContentHandler(handler);
            xmlReader.parse(input);

        } catch (Exception e) {

            e.printStackTrace();
        }
    }

    /**
     * 通过字符串获取流
     * @param xmlStr
     * @return
     */
    public static InputSource getInputSouceByString(String xmlStr) {
        StringReader sr = new StringReader(xmlStr);
        InputSource is = new InputSource(sr);
        return is;

    }

}

  所以,通过创建对应的DataParseHandler与XmlParserUtil关联起来就可以完成解析xml数据了。

 小结:关于SAX解析xml数据。比较麻烦的是,每份需要解析的xml数据对应的都需要创建相应的DefaultHandler2类,如果App后台接口较多的话,需要创建的解析后台数据的DefaultHandler2类也就相应的增多,这样会给App的维护带来一定的弊端。这种情况下建议还是使用simple-xml解析,毕竟simple-xml包也不大,也就418KB而已。笔者就经常使用simple-xml包解析xml数据。

   

    三。jackson包解析json格式数据

   上面讲解的是xml数据解析,接下来将谈谈json数据的解析,json数据的解析有很多种方式。当然,我个人比较喜欢的是jackson包对Json数据的解析,jackson包相对来说比较大一点,有1MB以上,不过速度快,效率高,性能72个赞。这个就是笔者比较青睐它的原因。当然了,有时候考虑到工程的大小,也不得不考虑其他方式的解析,google也提供了一些json解析的工具包,这里也不再一一介绍,有兴趣可以去google官网去了解了解。这里主要还是介绍jackson的解析,不喜欢的可以绕道绕道咯。jackson的官网地址为:http://jackson.codehaus.org/,相关的jar包可以到官网上下载。

    下面是整个Demo工程文件截图,如下图:


     同样的,该工程也是在simple-xml工程的基础上去做处理,也是将解析后的数据通过ExpandableListView显示出来。相同的类,这里就不在贴出来了。不过相关的实体类会有变化。assets目录中的jsonData文件内容为json格式。内容和simple-xml工程中的data.xml文件内容一样,只不过是json格式,我们来看看jsonData文件内容。

   1.jsonData文件内容如下(注意:将jsonData文件的编码格式设置为UTF-8,否则文件将出现乱编吗):

  1. {  
  2.   “dataContent”: {  
  3.     “group”: [  
  4.       {  
  5.         “groupID”: “1”,  
  6.         “groupName”: ”第一组”,  
  7.         “member”: [  
  8.           {  
  9.             “name”: ”张三”,  
  10.             “age”: “22”  
  11.           },  
  12.           {  
  13.             “name”: ”李四”,  
  14.             “age”: “24”  
  15.           },  
  16.           {  
  17.             “name”: ”欧阳雪”,  
  18.             “age”: “18”  
  19.           }  
  20.         ]  
  21.       },  
  22.       {  
  23.         “groupID”: “2”,  
  24.         “groupName”: ”第二组”,  
  25.         “member”: [  
  26.           {  
  27.             “name”: ”司徒静”,  
  28.             “age”: “19”  
  29.           },  
  30.           {  
  31.             “name”: ”叶笙”,  
  32.             “age”: “26”  
  33.           },  
  34.           {  
  35.             “name”: ”杨风”,  
  36.             “age”: “25”  
  37.           }  
  38.         ]  
  39.       },  
  40.       {  
  41.         “groupID”: “3”,  
  42.         “groupName”: ”第三组”,  
  43.         “member”: [  
  44.           {  
  45.             “name”: ”王龙”,  
  46.             “age”: “32”  
  47.           },  
  48.           {  
  49.             “name”: ”西门胜男”,  
  50.             “age”: “21”  
  51.           },  
  52.           {  
  53.             “name”: ”张铬”,  
  54.             “age”: “45”  
  55.           }  
  56.         ]  
  57.       }  
  58.     ]  
  59.   }  
  60. }  
{
  "dataContent": {
    "group": [
      {
        "groupID": "1",
        "groupName": "第一组",
        "member": [
          {
            "name": "张三",
            "age": "22"
          },
          {
            "name": "李四",
            "age": "24"
          },
          {
            "name": "欧阳雪",
            "age": "18"
          }
        ]
      },
      {
        "groupID": "2",
        "groupName": "第二组",
        "member": [
          {
            "name": "司徒静",
            "age": "19"
          },
          {
            "name": "叶笙",
            "age": "26"
          },
          {
            "name": "杨风",
            "age": "25"
          }
        ]
      },
      {
        "groupID": "3",
        "groupName": "第三组",
        "member": [
          {
            "name": "王龙",
            "age": "32"
          },
          {
            "name": "西门胜男",
            "age": "21"
          },
          {
            "name": "张铬",
            "age": "45"
          }
        ]
      }
    ]
  }
}

   接下来,我们看看主页面的代码。

   2.MainActivity.java文件代码如下:

  1. package com.steven.android.jackson.activity;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import org.codehaus.jackson.map.ObjectMapper;  
  8. import org.codehaus.jackson.type.TypeReference;  
  9. import android.app.Activity;  
  10. import android.os.Bundle;  
  11. import android.view.Menu;  
  12. import android.widget.ExpandableListView;  
  13. import com.steven.android.jackson.adapter.ExpandAdapter;  
  14. import com.steven.android.jackson.entity.JsonResponseEntity;  
  15. /** 
  16.  * 描述:主页面 
  17.  * @author stevenhu223 
  18.  * 
  19.  */  
  20. public class MainActivity extends Activity {  
  21.       
  22.     private ExpandableListView mExpandableListView;  
  23.     private ExpandAdapter mAdapter;  
  24.     private ObjectMapper mObjectMapper;  
  25.       
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.activity_main);  
  30.         mExpandableListView = (ExpandableListView) findViewById(R.id.expanlist_content);  
  31.         mObjectMapper = new ObjectMapper();  
  32.         try {  
  33.             parseJsonData();  
  34.         } catch (Exception e) {  
  35.             // TODO Auto-generated catch block  
  36.             e.printStackTrace();  
  37.         }  
  38.     }  
  39.   
  40.     @Override  
  41.     public boolean onCreateOptionsMenu(Menu menu) {  
  42.         // Inflate the menu; this adds items to the action bar if it is present.  
  43.         getMenuInflater().inflate(R.menu.main, menu);  
  44.         return true;  
  45.     }  
  46.   
  47.     /** 
  48.      * json数据格式解析 
  49.      * @throws Exception 
  50.      */  
  51.     private void parseJsonData()  throws Exception{  
  52.         InputStream inputStream = getResources().getAssets().open(”jsonData”);  
  53.         String dataContent = convertStreamToString(inputStream);  
  54.         try {  
  55.             JsonResponseEntity datEntity = mObjectMapper.readValue(dataContent,  
  56.                     new TypeReference<JsonResponseEntity>() {  
  57.                     });  
  58.             mAdapter = new ExpandAdapter(this, datEntity.getDataContent().getGroup());  
  59.             mExpandableListView.setAdapter(mAdapter);  
  60.         } catch (Exception e) {  
  61.             // TODO: handle exception  
  62.             e.printStackTrace();  
  63.         }  
  64.     }  
  65.       
  66.     /** 
  67.      * 输入流转字符串 
  68.      * @param is 
  69.      * @return 
  70.      */  
  71.     public String convertStreamToString(InputStream is) {  
  72.   
  73.         BufferedReader reader = new BufferedReader(new InputStreamReader(is));  
  74.         StringBuilder sb = new StringBuilder();  
  75.         String line = null;  
  76.         try {  
  77.             while ((line = reader.readLine()) != null) {  
  78.                 sb.append(line);  
  79.             }  
  80.         } catch (IOException e) {  
  81.             e.printStackTrace();  
  82.         } finally {  
  83.             try {  
  84.                 is.close();  
  85.             } catch (IOException e) {  
  86.                 e.printStackTrace();  
  87.             }  
  88.         }  
  89.         return sb.toString();  
  90.   
  91.     }  
  92.       
  93. }  
package com.steven.android.jackson.activity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ExpandableListView;
import com.steven.android.jackson.adapter.ExpandAdapter;
import com.steven.android.jackson.entity.JsonResponseEntity;
/**
 * 描述:主页面
 * @author stevenhu223
 *
 */
public class MainActivity extends Activity {

    private ExpandableListView mExpandableListView;
    private ExpandAdapter mAdapter;
    private ObjectMapper mObjectMapper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mExpandableListView = (ExpandableListView) findViewById(R.id.expanlist_content);
        mObjectMapper = new ObjectMapper();
        try {
            parseJsonData();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * json数据格式解析
     * @throws Exception
     */
    private void parseJsonData()  throws Exception{
        InputStream inputStream = getResources().getAssets().open("jsonData");
        String dataContent = convertStreamToString(inputStream);
        try {
            JsonResponseEntity datEntity = mObjectMapper.readValue(dataContent,
                    new TypeReference<JsonResponseEntity>() {
                    });
            mAdapter = new ExpandAdapter(this, datEntity.getDataContent().getGroup());
            mExpandableListView.setAdapter(mAdapter);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    /**
     * 输入流转字符串
     * @param is
     * @return
     */
    public String convertStreamToString(InputStream is) {

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();

    }

}
  代码中,parseJsonData方法实现jackson解析json格式数据,ObjectMapper来自jackson包,通过调用mObjectMapper对象readValue函数就可以实现对json数据的解析。我们来看看JsonResponseEntity实体类的代码。

  3.JsonResponseEntity.java文件代码如下:

  1. package com.steven.android.jackson.entity;  
  2.   
  3. public class JsonResponseEntity {  
  4.   
  5.     /** 
  6.      * jackson解析有严格的规定,变量名要和对应的元素名一致,否则解析会时会报错 
  7.      */  
  8.     private DataContentEntity dataContent;  
  9.   
  10.     public DataContentEntity getDataContent() {  
  11.         return dataContent;  
  12.     }  
  13.   
  14.     public void setDataContent(DataContentEntity dataContent) {  
  15.         this.dataContent = dataContent;  
  16.     }  
  17.       
  18. }  
package com.steven.android.jackson.entity;

public class JsonResponseEntity {

    /**
     * jackson解析有严格的规定,变量名要和对应的元素名一致,否则解析会时会报错
     */
    private DataContentEntity dataContent;

    public DataContentEntity getDataContent() {
        return dataContent;
    }

    public void setDataContent(DataContentEntity dataContent) {
        this.dataContent = dataContent;
    }

}
  值得注意的是,jackson解析有严格的实体类变量名对应json数据中的key名相同的限制,如果不一致,解析将会有问题。变量名dataContent对应的就是jsonData文件内容中的第一个key(dataContent);接下来来列出的其他实体类中的变量名,集合名都要和jsonData文件内容中的一致。
  4.DataContentEntity.java文件代码如下:

  1. package com.steven.android.jackson.entity;  
  2.   
  3. import java.util.List;  
  4.   
  5. public class DataContentEntity {  
  6.   
  7.     //变量名对应json内容中的group  
  8.     private List<GroupEntity> group;  
  9.   
  10.     public List<GroupEntity> getGroup() {  
  11.         return group;  
  12.     }  
  13.   
  14.     public void setGroup(List<GroupEntity> group) {  
  15.         this.group = group;  
  16.     }  
  17. }  
package com.steven.android.jackson.entity;

import java.util.List;

public class DataContentEntity {

    //变量名对应json内容中的group
    private List<GroupEntity> group;

    public List<GroupEntity> getGroup() {
        return group;
    }

    public void setGroup(List<GroupEntity> group) {
        this.group = group;
    }
}
  5.GroupEntity文件代码如下:

  1. package com.steven.android.jackson.entity;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class GroupEntity {  
  7.       
  8.     private String groupID; //变量名对应json内容中的groupID  
  9.     private String groupName; //变量名对应json内容中的groupName  
  10.     //变量名对应json内容中的member  
  11.     private List<MemberEntity> member = new ArrayList<MemberEntity>();  
  12.   
  13.     public String getGroupID() {  
  14.         return groupID;  
  15.     }  
  16.   
  17.     public void setGroupID(String groupID) {  
  18.         this.groupID = groupID;  
  19.     }  
  20.   
  21.     public String getGroupName() {  
  22.         return groupName;  
  23.     }  
  24.   
  25.     public void setGroupName(String groupName) {  
  26.         this.groupName = groupName;  
  27.     }  
  28.   
  29.     public List<MemberEntity> getMember() {  
  30.         return member;  
  31.     }  
  32.   
  33.     public void setMember(List<MemberEntity> member) {  
  34.         this.member = member;  
  35.     }  
  36.   
  37. }  
package com.steven.android.jackson.entity;

import java.util.ArrayList;
import java.util.List;

public class GroupEntity {

    private String groupID; //变量名对应json内容中的groupID
    private String groupName; //变量名对应json内容中的groupName
    //变量名对应json内容中的member
    private List<MemberEntity> member = new ArrayList<MemberEntity>();

    public String getGroupID() {
        return groupID;
    }

    public void setGroupID(String groupID) {
        this.groupID = groupID;
    }

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    public List<MemberEntity> getMember() {
        return member;
    }

    public void setMember(List<MemberEntity> member) {
        this.member = member;
    }

}
  6.MemberEntity.java文件代码如下:
  1. package com.steven.android.jackson.entity;  
  2.   
  3. public class MemberEntity {  
  4.   
  5.     private String name; //变量名对应json内容中的name  
  6.     private String age; //变量名对应json内容中的age  
  7.   
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.   
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.   
  16.     public String getAge() {  
  17.         return age;  
  18.     }  
  19.   
  20.     public void setAge(String age) {  
  21.         this.age = age;  
  22.     }  
  23.   
  24. }  
package com.steven.android.jackson.entity;

public class MemberEntity {

    private String name; //变量名对应json内容中的name
    private String age; //变量名对应json内容中的age

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

}
  以上为jackson解析相关的实体类。通过MainActivity的parseJson方法就可以将json数据解析成封装的DataJsonResponseEntity了。

 四。jackson数据转换解析

     jackson包不仅仅是单纯的解析json格式数据,还可以双向解析,甚至可以将json数据解析成map映射等。接下来将主要介绍Jackson包的json与bean(实体类)、Map与json之间的双向解析。

   下面是整个Demo工程文件截图,如下图:


  工程中,assets目录中的jsonData文件内容为一些相关销售报表数据。

  1.jsonData文件内容如下(注意:将jsonData文件的编码格式设置为UTF-8,否则文件将出现乱编吗):

  1. {  
  2.     “retCode”: “0”,  
  3.     “retMsg”: “success”,  
  4.     “chart”: {  
  5.         “caption”: “2014季度销售报表汇总”,  
  6.         “subcaption”: “2014季度”,  
  7.         “xaxisname”: ”销售月份”,  
  8.         “yaxisname”: ”销售额度”,  
  9.         “numberprefix”: ”$”  
  10.     },  
  11.     “data”: [  
  12.         {  
  13.             “label”: ”一月”,  
  14.             “value”: “17400”  
  15.         },  
  16.         {  
  17.             “label”: ”二月”,  
  18.             “value”: “19800”  
  19.         },  
  20.         {  
  21.             “label”: ”三月”,  
  22.             “value”: “21800”  
  23.         },  
  24.         {  
  25.             “label”: ”四月”,  
  26.             “value”: “23800”  
  27.         },  
  28.         {  
  29.             “label”: ”五月”,  
  30.             “value”: “29600”  
  31.         },  
  32.         {  
  33.             “label”: ”六月”,  
  34.             “value”: “27600”  
  35.         },  
  36.         {  
  37.             “label”: ”七月”,  
  38.             “value”: “31800”  
  39.         },  
  40.         {  
  41.             “label”: ”八月”,  
  42.             “value”: “39700”  
  43.         },  
  44.         {  
  45.             “label”: ”九月”,  
  46.             “value”: “37800”  
  47.         },  
  48.         {  
  49.             “label”: ”十月”,  
  50.             “value”: “21900”  
  51.         },  
  52.         {  
  53.             “label”: ”十一月”,  
  54.             “value”: “32900”  
  55.         },  
  56.         {  
  57.             “label”: ”十二月”,  
  58.             “value”: “39800”  
  59.         }  
  60.     ]  
  61. }  
{
    "retCode": "0",
    "retMsg": "success",
    "chart": {
        "caption": "2014季度销售报表汇总",
        "subcaption": "2014季度",
        "xaxisname": "销售月份",
        "yaxisname": "销售额度",
        "numberprefix": "$"
    },
    "data": [
        {
            "label": "一月",
            "value": "17400"
        },
        {
            "label": "二月",
            "value": "19800"
        },
        {
            "label": "三月",
            "value": "21800"
        },
        {
            "label": "四月",
            "value": "23800"
        },
        {
            "label": "五月",
            "value": "29600"
        },
        {
            "label": "六月",
            "value": "27600"
        },
        {
            "label": "七月",
            "value": "31800"
        },
        {
            "label": "八月",
            "value": "39700"
        },
        {
            "label": "九月",
            "value": "37800"
        },
        {
            "label": "十月",
            "value": "21900"
        },
        {
            "label": "十一月",
            "value": "32900"
        },
        {
            "label": "十二月",
            "value": "39800"
        }
    ]
}
    2.MainActivity.java文件代码如下:

  1. package com.stevenhu.android.jacksontest;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.io.StringWriter;  
  8. import java.util.ArrayList;  
  9. import java.util.HashMap;  
  10. import java.util.Iterator;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13. import java.util.Set;  
  14. import org.codehaus.jackson.JsonGenerator;  
  15. import org.codehaus.jackson.map.ObjectMapper;  
  16. import org.codehaus.jackson.type.TypeReference;  
  17. import android.app.Activity;  
  18. import android.os.Bundle;  
  19. import android.view.Menu;  
  20. import android.view.MenuItem;  
  21. import android.widget.TextView;  
  22. import com.stevenhu.android.jacksontest.bean.ChartsDataEntity;  
  23. import com.stevenhu.android.jacksontest.bean.ChartsEntity;  
  24. import com.stevenhu.android.jacksontest.bean.DataSetEntity;  
  25.   
  26. public class MainActivity extends Activity{  
  27.   
  28.     private String jsonData;  
  29.     private String mResult;  
  30.     private TextView text_content_show;  
  31.     private ChartsDataEntity mChartsDataEntity;  
  32.     private ObjectMapper mObjectMapper;  
  33.     private List<DataSetEntity> mDataSets;  
  34.       
  35.     @Override  
  36.     protected void onCreate(Bundle savedInstanceState) {  
  37.         super.onCreate(savedInstanceState);  
  38.         setContentView(R.layout.activity_main);  
  39.         try {  
  40.             initialize();  
  41.         } catch (Exception e) {  
  42.             // TODO Auto-generated catch block  
  43.             e.printStackTrace();  
  44.         }  
  45.         initBean();  
  46.         text_content_show.setText(parseMapToJson());  
  47.     }  
  48.   
  49.     /** 
  50.      * 初始化 
  51.      */  
  52.     private void initialize() throws Exception{  
  53.           
  54.         text_content_show = (TextView)findViewById(R.id.text_content_show);  
  55.         InputStream inputStream = getResources().getAssets().open(”jsonData”);  
  56.         jsonData = convertStreamToString(inputStream);  
  57.           
  58.     }  
  59.       
  60.     /** 
  61.      * 输入流转字符串 
  62.      * @param is 
  63.      * @return 
  64.      */  
  65.     public String convertStreamToString(InputStream is) {  
  66.   
  67.         BufferedReader reader = new BufferedReader(new InputStreamReader(is));  
  68.         StringBuilder sb = new StringBuilder();  
  69.         String line = null;  
  70.         try {  
  71.             while ((line = reader.readLine()) != null) {  
  72.                 sb.append(line);  
  73.             }  
  74.         } catch (IOException e) {  
  75.             e.printStackTrace();  
  76.         } finally {  
  77.             try {  
  78.                 is.close();  
  79.             } catch (IOException e) {  
  80.                 e.printStackTrace();  
  81.             }  
  82.         }  
  83.         return sb.toString();  
  84.   
  85.     }  
  86.       
  87.     /** 
  88.      * 初始化Bean 
  89.      */  
  90.     private void initBean() {  
  91.         mObjectMapper = new ObjectMapper();  
  92.         mChartsDataEntity = new ChartsDataEntity();  
  93.         mDataSets = new ArrayList<DataSetEntity>();  
  94.         //ChartsEntity对象定义了图表属性  
  95.         ChartsEntity chart = new ChartsEntity();  
  96.         chart.setCaption(”2014季度销售报表汇总”);  
  97.         chart.setSubcaption(”2014季度”);  
  98.         chart.setXaxisname(”销售月份”);  
  99.         chart.setYaxisname(”销售额度”);  
  100.         chart.setNumberprefix("</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mChartsDataEntity.setChart(chart);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"一月"</span><span>,&nbsp;</span><span class="string">"17400"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"二月"</span><span>,&nbsp;</span><span class="string">"19800"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"三月"</span><span>,&nbsp;</span><span class="string">"21800"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"四月"</span><span>,&nbsp;</span><span class="string">"23800"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"五月"</span><span>,&nbsp;</span><span class="string">"29600"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"六月"</span><span>,&nbsp;</span><span class="string">"27600"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"七月"</span><span>,&nbsp;</span><span class="string">"31800"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"八月"</span><span>,&nbsp;</span><span class="string">"39700"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"九月"</span><span>,&nbsp;</span><span class="string">"37800"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"十月"</span><span>,&nbsp;</span><span class="string">"21900"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"十一月"</span><span>,&nbsp;</span><span class="string">"32900"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"十二月"</span><span>,&nbsp;</span><span class="string">"39800"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initDataSet(<span class="string">"一月"</span><span>,&nbsp;</span><span class="string">"17400"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;初始化DataSet</span>&nbsp;</span></li><li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;month</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;sale</span>&nbsp;</span></li><li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;initDataSet(String&nbsp;month,&nbsp;String&nbsp;sale)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//DataSetEntity对象定义了图表的一组数据</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSetEntity&nbsp;dataSet&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;DataSetEntity();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSet.setLabel(month);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSet.setValue(sale);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDataSets.add(dataSet);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mChartsDataEntity.setData(mDataSets);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;json数据格式转map</span>&nbsp;</span></li><li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;parseJsonToMap()&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;jsonString&nbsp;=&nbsp;<span class="string">"{\"name\":\"2014季度销售报表汇总\",\"chart\":{\"caption\":\"2014季度销售报表汇总\","</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"&nbsp;\"subcaption\":\"2014季度\",\"xaxisname\":\"销售月份\",&nbsp;\"yaxisname\":\"销售额度\",&nbsp;\"numberprefix\":\"\”}}”;  
  101.         if (null != mResult) {  
  102.             mResult = ”“;  
  103.         }  
  104.           
  105.         try {  
  106.             Map<String , Map<String , Object>> maps = mObjectMapper.readValue(jsonString, Map.class);  
  107.             Set<String> keys = maps.keySet();  
  108.             Iterator<String> iterator = keys.iterator();  
  109.             while (iterator.hasNext()) {  
  110.                 String key = iterator.next();  
  111.                 mResult += key + ”:” + maps.get(key) + “\n”;  
  112.             }  
  113.               
  114.             return mResult;  
  115.         } catch (Exception e) {  
  116.             e.printStackTrace();  
  117.         }  
  118.         return null;  
  119.     }  
  120.       
  121.     /** 
  122.      * map转json格式数据 
  123.      * @return 
  124.      */  
  125.     private String parseMapToJson() {  
  126.         Map<String , Object> map = new HashMap<String , Object>();  
  127.         String chartTitle = mChartsDataEntity.getChart().getCaption();  
  128.         map.put(”name”, chartTitle);  
  129.         map.put(”chart”, mChartsDataEntity.getChart());  
  130.         try {  
  131.             StringWriter sw = new StringWriter();  
  132.             JsonGenerator jsonGenerator = mObjectMapper.getJsonFactory().createJsonGenerator(sw);  
  133.             jsonGenerator.writeObject(map);  
  134.             jsonGenerator.close();  
  135.             String json = sw.toString();  
  136.             return json;  
  137.         } catch (Exception e) {  
  138.             // TODO: handle exception  
  139.         }  
  140.         return null;  
  141.     }  
  142.       
  143.     /** 
  144.      * json数据格式转实体类 
  145.      * @return 
  146.      */  
  147.     private String parseJsonToBean() {  
  148.       
  149.         try {  
  150.             ChartsDataEntity chartsData = mObjectMapper.readValue(jsonData,  
  151.                     new TypeReference<ChartsDataEntity>() {  
  152.                     });  
  153.             ChartsEntity charts = chartsData.getChart();  
  154.             //String name = chartsData.getName();  
  155.             mResult = ”RetCode–>” + chartsData.getRetCode() + “\n” +   
  156.                     ”RetMsg–>” + chartsData.getRetMsg() + “\n” +   
  157.                      ”caption–>” + charts.getCaption() + “\n” +   
  158.                     ”subcaption–>” + charts.getSubcaption() + “\n” +   
  159.                     ”xaxisname–>” + charts.getXaxisname() + “\n” +  
  160.                     ”yaxisname–>” + charts.getYaxisname() + “\n” +   
  161.                     ”numberprefix–>” + charts.getNumberprefix();  
  162.         } catch (Exception e) {  
  163.             // TODO: handle exception  
  164.             e.printStackTrace();  
  165.         }  
  166.           
  167.         List<DataSetEntity> datas = mChartsDataEntity.getData();  
  168.           
  169.         for (DataSetEntity dataSet : datas) {  
  170.             mResult += ”\n” + “label–>” + dataSet.getLabel()  + “  ” +   
  171.                     ”value–>” + dataSet.getValue();  
  172.         }  
  173.           
  174.         return mResult;  
  175.     }  
  176.       
  177.     /** 
  178.      * 实体类转json格式数据 
  179.      * @return 
  180.      */  
  181.     private String parseBeanToJson() {  
  182.           
  183.         try {  
  184.             StringWriter sw = new StringWriter();  
  185.             JsonGenerator jsonGenerator = mObjectMapper.getJsonFactory().createJsonGenerator(sw);  
  186.             //objectMapper.writeValue(jsonGenerator, mChartsDataEntity);  
  187.             jsonGenerator.writeObject(mChartsDataEntity);  
  188.             jsonGenerator.close();  
  189.             String json = sw.toString();  
  190.             return json;              
  191.         } catch (Exception e) {  
  192.             // TODO: handle exception  
  193.             e.printStackTrace();  
  194.         }  
  195.         return null;  
  196.     }  
  197.       
  198.     @Override  
  199.     public boolean onCreateOptionsMenu(Menu menu) {  
  200.         // Inflate the menu; this adds items to the action bar if it is present.  
  201.         getMenuInflater().inflate(R.menu.main, menu);  
  202.         return true;  
  203.     }  
  204.       
  205.     @Override  
  206.     public boolean onOptionsItemSelected(MenuItem item) {  
  207.         switch (item.getItemId()) {  
  208.         case R.id.item_map_to_json:  
  209.             text_content_show.setText(parseMapToJson());  
  210.             break;  
  211.   
  212.         case R.id.item_json_to_map:  
  213.             text_content_show.setText(parseJsonToMap());  
  214.             break;  
  215.               
  216.         case R.id.item_bean_to_json:  
  217.             text_content_show.setText(parseBeanToJson());  
  218.             break;  
  219.               
  220.         case R.id.item_json_to_bean:  
  221.             text_content_show.setText(parseJsonToBean());  
  222.             break;  
  223.         }  
  224.         return true;  
  225.     }  
  226.   
  227. }  
package com.stevenhu.android.jacksontest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import com.stevenhu.android.jacksontest.bean.ChartsDataEntity;
import com.stevenhu.android.jacksontest.bean.ChartsEntity;
import com.stevenhu.android.jacksontest.bean.DataSetEntity;

public class MainActivity extends Activity{

    private String jsonData;
    private String mResult;
    private TextView text_content_show;
    private ChartsDataEntity mChartsDataEntity;
    private ObjectMapper mObjectMapper;
    private List<DataSetEntity> mDataSets;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            initialize();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        initBean();
        text_content_show.setText(parseMapToJson());
    }

    /**
     * 初始化
     */
    private void initialize() throws Exception{

        text_content_show = (TextView)findViewById(R.id.text_content_show);
        InputStream inputStream = getResources().getAssets().open("jsonData");
        jsonData = convertStreamToString(inputStream);

    }

    /**
     * 输入流转字符串
     * @param is
     * @return
     */
    public String convertStreamToString(InputStream is) {

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();

    }

    /**
     * 初始化Bean
     */
    private void initBean() {
        mObjectMapper = new ObjectMapper();
        mChartsDataEntity = new ChartsDataEntity();
        mDataSets = new ArrayList<DataSetEntity>();
        //ChartsEntity对象定义了图表属性
        ChartsEntity chart = new ChartsEntity();
        chart.setCaption("2014季度销售报表汇总");
        chart.setSubcaption("2014季度");
        chart.setXaxisname("销售月份");
        chart.setYaxisname("销售额度");
        chart.setNumberprefix("$");

        mChartsDataEntity.setChart(chart);

        initDataSet("一月", "17400");
        initDataSet("二月", "19800");
        initDataSet("三月", "21800");
        initDataSet("四月", "23800");
        initDataSet("五月", "29600");
        initDataSet("六月", "27600");
        initDataSet("七月", "31800");
        initDataSet("八月", "39700");
        initDataSet("九月", "37800");
        initDataSet("十月", "21900");
        initDataSet("十一月", "32900");
        initDataSet("十二月", "39800");
        initDataSet("一月", "17400");

    }

    /**
     * 初始化DataSet
     * @param month
     * @param sale
     */
    private void initDataSet(String month, String sale) {
        //DataSetEntity对象定义了图表的一组数据
        DataSetEntity dataSet = new DataSetEntity();
        dataSet.setLabel(month);
        dataSet.setValue(sale);
        mDataSets.add(dataSet);
        mChartsDataEntity.setData(mDataSets);
    }

    /**
     * json数据格式转map
     * @return
     */
    private String parseJsonToMap() {
        String jsonString = "{\"name\":\"2014季度销售报表汇总\",\"chart\":{\"caption\":\"2014季度销售报表汇总\"," +
                " \"subcaption\":\"2014季度\",\"xaxisname\":\"销售月份\", \"yaxisname\":\"销售额度\", \"numberprefix\":\"$\"}}";
        if (null != mResult) {
            mResult = "";
        }

        try {
            Map<String , Map<String , Object>> maps = mObjectMapper.readValue(jsonString, Map.class);
            Set<String> keys = maps.keySet();
            Iterator<String> iterator = keys.iterator();
            while (iterator.hasNext()) {
                String key = iterator.next();
                mResult += key + ":" + maps.get(key) + "\n";
            }

            return mResult;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * map转json格式数据
     * @return
     */
    private String parseMapToJson() {
        Map<String , Object> map = new HashMap<String , Object>();
        String chartTitle = mChartsDataEntity.getChart().getCaption();
        map.put("name", chartTitle);
        map.put("chart", mChartsDataEntity.getChart());
        try {
            StringWriter sw = new StringWriter();
            JsonGenerator jsonGenerator = mObjectMapper.getJsonFactory().createJsonGenerator(sw);
            jsonGenerator.writeObject(map);
            jsonGenerator.close();
            String json = sw.toString();
            return json;
        } catch (Exception e) {
            // TODO: handle exception
        }
        return null;
    }

    /**
     * json数据格式转实体类
     * @return
     */
    private String parseJsonToBean() {

        try {
            ChartsDataEntity chartsData = mObjectMapper.readValue(jsonData,
                    new TypeReference<ChartsDataEntity>() {
                    });
            ChartsEntity charts = chartsData.getChart();
            //String name = chartsData.getName();
            mResult = "RetCode-->" + chartsData.getRetCode() + "\n" + 
                    "RetMsg-->" + chartsData.getRetMsg() + "\n" + 
                     "caption-->" + charts.getCaption() + "\n" + 
                    "subcaption-->" + charts.getSubcaption() + "\n" + 
                    "xaxisname-->" + charts.getXaxisname() + "\n" +
                    "yaxisname-->" + charts.getYaxisname() + "\n" + 
                    "numberprefix-->" + charts.getNumberprefix();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

        List<DataSetEntity> datas = mChartsDataEntity.getData();

        for (DataSetEntity dataSet : datas) {
            mResult += "\n" + "label-->" + dataSet.getLabel()  + "  " + 
                    "value-->" + dataSet.getValue();
        }

        return mResult;
    }

    /**
     * 实体类转json格式数据
     * @return
     */
    private String parseBeanToJson() {

        try {
            StringWriter sw = new StringWriter();
            JsonGenerator jsonGenerator = mObjectMapper.getJsonFactory().createJsonGenerator(sw);
            //objectMapper.writeValue(jsonGenerator, mChartsDataEntity);
            jsonGenerator.writeObject(mChartsDataEntity);
            jsonGenerator.close();
            String json = sw.toString();
            return json;            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.item_map_to_json:
            text_content_show.setText(parseMapToJson());
            break;

        case R.id.item_json_to_map:
            text_content_show.setText(parseJsonToMap());
            break;

        case R.id.item_bean_to_json:
            text_content_show.setText(parseBeanToJson());
            break;

        case R.id.item_json_to_bean:
            text_content_show.setText(parseJsonToBean());
            break;
        }
        return true;
    }

}
  在MainActvity中,通过parseMapToJson、parseJsonToMap、parseBeanToJson、parseJsonToBean等方法实现json与bean、map与json之间的解析转换。其他相关的解析实体类的代码就不贴出来了,原理都是一样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值