Android中のxml、json形式のデータ解析

39228 ワード

転載は出典を明記してください.http://blog.csdn.net/stevenhu_223/articale/detail/42520233
         本ブログ関連のDemoダウンロードリンク:http://download.csdn.net/detail/stevenhu_223/8340451
  前書き:Androidアプリケーションを開発する過程で、特にネットワーク要求に関するアプリは、解析バックグラウンドから戻ってくるデータに関連します.バックグラウンドから戻ってくるデータは2つのフォーマットにすぎません.xmlとjson形式です.どのようにしてこれらのバックグラウンドから戻ってきたデータをより便利に解析するかは、私たち開発者にとって重要です.次に、筆者がよく使うデータ解析方法をいくつか紹介します.
   一.simple-xml第三者jarパケット解析xmlフォーマットデータ
    simple-xmlはxmlとオブジェクトを交互に操作するツールバッグです.公式サイトは以下の通りです.http://simple.sourceforge.net/jarバッグは公式サイトでダウンロードできます.現在の最新バージョンのjarバッグを使っています.simple-xml-2.7.11.jarといいます.余計なことを言わないでください.コードこそ真実の証明です.
    以下はDemoプロジェクトファイル全体のスクリーンショットです.

     このDemoは主にsimple-xmlを通してastesディレクトリのdata.xmlファイルの内容データを解析して表示します.
    1.data.xmlファイルの内容は以下の通りです.



    
        
            1
               
            
                  
                22
            
            
                  
                24
            
            
                   
                18
            
        
        
            2
               
            
                   
                19
            
            
                  
                26
            
            
                  
                25
            
        
        
            3
               
            
                  
                32
            
            
                    
                21
            
            
                  
                45
            
        
    

 
 上のファイルの内容を通して、このファイルの内容は主に3つのグループのデータがあります.各グループのデータには3つのメンバーがいます.各グループには名前と年齢という2つのサブ要素があります.これらの解析内容をExpandable ListViewで表示します.
  2.ホームページのMainActivityコードは以下の通りです.
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]*([\\s\\S]*)[\\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 parseToBean(Class 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();

	}
}
 
上のコードの中で、パーミッションToBeanメソッドの機能は、xmlフォーマットのデータを対応するエンティティクラスに解析します.Persister類は、シンプル-xmlパッケージのクラスです.ParseToBean関数を呼び出して、xmlコンテンツデータをData ParsseResonseオブジェクトに解析してパッケージ化します.次に、Data ParsseResonseのコードを見てみます.
   3.Data Paresonse.javaファイルコードは以下の通りです.
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 mGroupEntities;
}
  上のコードによって、simple-xmlパケットがエンティティクラスに解析される場合、エンティティクラスで解析が必要なxmlフォーマットのデータ要素名に対応する注釈が非常に重要であることが分かります.これらのコメントは全部simple-xmlパッケージから来ています.DataParsseResonseクラスの@Root(name=「NewDataSet」)は、xmlデータのルート要素data Contectからのコメントです.group要素はルート要素datantentに配列として存在するので、ここの集合mGroup Entintiesは解析的なgroup要素配列の内容セットを表しています.必然的にその注釈も@Element Listであるべきです.次に、GroupEntityエンティティ類のコードを見ます.
 4.Group Entity.javaファイルコードは以下の通りです.
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 memberEntities;
	
}
 
 コードの中で@Root(name=「group」)はxmlファイルのグループの要素に対応しています.Element(name=「groupID」)は、group要素のサブ要素groupIDに対応しています.@Element(name=「groupName」)は、group要素のサブ要素groupNameに対応しています.member元素はgroup元素の中に配列として存在しているので、Group Entinityの中にも必ず集合の形で存在しています.注釈も@Element Listであるべきです.次に、実体系のメンバーEntityのコードを解析してみます.
   5.Member Enttity.javaファイルコードは以下の通りです.
@Root(name="member")
public class MemberEntity {
	@Element(required=false) public String name;
	@Element(required=false) public String age;
}
 
 Member Entityコードのコードコメントはここでは多くなく、原理は他の実体類と一致しています.
   解析したデータをExpandable ListViewで表示するには、Expandable ListView対応のアダプターを作成し、解析したエンティティ類形式のデータを充填する必要があります.アダプターExpandAdapterのコードを見に来ました.
   6.ExpandAdapter.javaファイルコードは以下の通りです.
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 mGroupEntities;
	private LayoutInflater mInflater;
	
	public  ExpandAdapter(Context context, List 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でパーサートビーンを呼び出して解析を完了した後、解析したエンティティ類をアダプタに充填し、Expandable ListViewで表示します.プロジェクト中のView Holderはカスタムクラスであり、Adapterクラスで頻繁にView Holderを作成しないために存在する.
 7.View Holder.javaファイルコードは以下の通りです.
package com.steven.android.sax.xml.custom;

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

public class ViewHolder {
	@SuppressWarnings("unchecked")
	public static  T get(View view, int id) {
		SparseArray viewHolder = (SparseArray) view.getTag();
		if (viewHolder == null) {
			viewHolder = new SparseArray();
			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データを解析するかを説明しました.ここでは、サードパーティパッケージを通過する必要がなく、どのようにSAXを通して効果的にxmlデータを解析するかを紹介します.SAXの紹介に関しては、筆者はここでもう邪魔になりません.多くのプログラム猿が接触したと信じています.
   以下はDemoプロジェクトファイル全体のスクリーンショットです.
    この工程コードは、シンプル-xml工程コードと同様に、解析されたxmlデータをExpandable ListViewで表示します.astesディレクトリのdata.xmlファイルの内容、ExpandAdapter類、関連ファイルのレイアウトとsimple-xmlプロジェクトはほとんど同じです.ここでは貼りません.しかし、エンティティクラスは変更されており、パブリックメンバー変数の形ではなく、プライベート変数の形で存在し、set、getの形で値を割り当て、値を取る.本体類のコードを見てみます.
   1.Group Entity.javaファイルコードは以下の通りです.
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 memberEntities = new ArrayList();;

	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 getMemberEntities() {
		return memberEntities;
	}

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

}
   2.mber Entity.javaファイルコードは以下の通りです.
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ファイルコードは以下の通りです.
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]*([\\s\\S]*)[\\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 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では、Match AndPartseData方法でSAX解析xmlデータを実現します.SAX解析xmlデータは、Default Handler 2を継承するクラスをどのように作成するかがポイントです.プロジェクトで作成されたData PareseHandler類を見に来ました.
  4.Data PartseHandler.javaファイルコードは以下の通りです.
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
 * 
 * @author stevenhu223
 */
public class DataParseHandler extends DefaultHandler2 {

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

	StringBuffer cData;//    cdata  

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

	@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 getResult() {
		return groupEntities;
	}

}
   通過する
DataPareseHandlerのgetResult()メソッドは、解析されたxmlデータが成功した後のエンティティセットを取得することができます.創xml解析データに対応するDataParsseHandler類の後に、この類のオブジェクトと解析が必要なxmlデータを関連付ける必要があり、XmlParUtilツール類があります.
  5.Xml ParUtil.javaファイルコードは以下の通りです.
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;

	}
	
}
  したがって、対応するデータを作成することにより、Xml PaserUtilと関連付けることで、解析xmlデータを作成することができます.
 まとめ:SAX解析についてxmlデータ.面倒なことに、解析が必要なxmlデータごとに対応するDefaultHandler 2類を作成する必要があります.Appのバックグラウンドインターフェースが多いと、作成したい解析バックグラウンドデータのDefaultHandler 2類もそれに応じて増加し、Appのメンテナンスに一定の弊害をもたらします.この場合は、やはりシンプル-xmlを使って解析することをお勧めします.なにしろ、シンプル-xmlパッケージは大きくなく、418 KBだけです.筆者は常にシンプルなパックを使って、xmlデータを解析しています.
   
    三番目です.jacksonパッケージ解析Jsonフォーマットデータ
   上で説明したのはxmlデータ解析です.次にjsonデータの解析について話します.jsonデータの解析にはいろいろな方法があります.もちろん、私が個人的に好きなのはジャックバックのJsonデータの解析です.ジャックバックは比較的大きいです.1 MB以上がありますが、スピードが速くて、効率が高くて、性能が72個もあります.これが筆者が比較的に愛顧している理由です.もちろん、工事の大きさを考慮して、他の方法の解析を考えなければならない場合もあります.googleはjson解析のツールバッグを提供しています.ここではいちいち紹介しません.興味があれば、google公式サイトで調べてみてください.ここでは主にjacksonの解析を紹介します.嫌なものは回り道してもいいです.jacksonの公式サイトの住所は以下の通りです.http://jackson.codehaus.org/関連するjarカバンは公式サイトでダウンロードできます.
    以下はDemoプロジェクトファイル全体のスクリーンショットです.

     同様に、このプロジェクトもまた、シンプル-xml工程をもとに処理を行うものであり、解析後のデータをExpandable ListViewによって表示するものである.同じ種類はここでは貼り出されません.ただし、関連する実体類は変化します.astesディレクトリのjson Dataファイルの内容はjson形式です.内容はsimple-xmlプロジェクトのdata.xmlファイルの内容と同じです.json形式です.json Dataファイルの内容を見に来ました.
   1.jsonDataファイルの内容は以下の通りです.
{
  "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ファイルコードは以下の通りです.
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() {
					});
			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();

	}
	
}
 
コードの中で、parseJson Data方法はjackson形式のデータを解析することを実現して、Object Mapperはjacksonから来て、mObject Mapperの対象readValue関数を呼び出してjsonデータに対する解析を実現することができます.JsonseEntity本体のコードを見てみます.
  3.JsonseEnttity.javaファイルのコードは以下の通りです.
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名と同じ制限に対応していますが、一致しないと解析に問題があります.変数名data Contectに対応するのは、json Dataファイルの内容の中の最初のkeyです.続いてリストされる他のエンティティクラスの変数名は、集合名とjsonDataファイルの内容と一致します.  4.Data ContentEnttity.javaファイルコードは以下の通りです.
package com.steven.android.jackson.entity;

import java.util.List;

public class DataContentEntity {

	//     json    group
	private List group;

	public List getGroup() {
		return group;
	}

	public void setGroup(List group) {
		this.group = group;
	}
}
  5.GroupEntityファイルコードは以下の通りです.
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 member = new ArrayList();

	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 getMember() {
		return member;
	}

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

}
  6.メンバーEnttity.javaファイルのコードは以下の通りです.
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データをパッケージ化したDataJson ResonseEntityに解析することができます.
 四です.jacksonデータ変換解析     jacksonパッケージは単純な解析だけでなく、双方向解析もできます.jsonデータをmapマッピングなどに解析することもできます.次に、Jacksonカバンのjsonとbean(実体類)、Mapとjsonの双方向解析について紹介します.
   以下はDemoプロジェクトファイル全体のスクリーンショットです.
Android中的xml、json格式数据解析_第1张图片
  プロジェクトの中で、astesディレクトリの中のjsonDataファイルの内容はいくつかの関連している販売報告書のデータです.
  1.jsonDataファイルの内容は以下の通りです.
{
    "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ファイルコードは以下の通りです.
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 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();
		//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> maps = mObjectMapper.readValue(jsonString, Map.class);
			Set keys = maps.keySet();
		    Iterator iterator = keys.iterator();
		    while (iterator.hasNext()) {
		    	String key = iterator.next();
		    	mResult += key + ":" + maps.get(key) + "
"; } return mResult; } catch (Exception e) { e.printStackTrace(); } return null; } /** * map json * @return */ private String parseMapToJson() { Map map = new HashMap(); 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() { }); ChartsEntity charts = chartsData.getChart(); //String name = chartsData.getName(); mResult = "RetCode-->" + chartsData.getRetCode() + "
" + "RetMsg-->" + chartsData.getRetMsg() + "
" + "caption-->" + charts.getCaption() + "
" + "subcaption-->" + charts.getSubcaption() + "
" + "xaxisname-->" + charts.getXaxisname() + "
" + "yaxisname-->" + charts.getYaxisname() + "
" + "numberprefix-->" + charts.getNumberprefix(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } List datas = mChartsDataEntity.getData(); for (DataSetEntity dataSet : datas) { mResult += "
" + "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では、パースMapToJson、パースJson ToMap、パーサーンToJson、parseBenToJsonなどを通じて、jsonとbean、mapとjsonの間の解析変換を実現します.その他の関連する解析エンティティ類のコードは貼り出されません.原理は同じです.