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ファイルの内容は以下の通りです.
上のファイルの内容を通して、このファイルの内容は主に3つのグループのデータがあります.各グループのデータには3つのメンバーがいます.各グループには名前と年齢という2つのサブ要素があります.これらの解析内容をExpandable ListViewで表示します.
2.ホームページのMainActivityコードは以下の通りです.
上のコードの中で、パーミッションToBeanメソッドの機能は、xmlフォーマットのデータを対応するエンティティクラスに解析します.Persister類は、シンプル-xmlパッケージのクラスです.ParseToBean関数を呼び出して、xmlコンテンツデータをData ParsseResonseオブジェクトに解析してパッケージ化します.次に、Data ParsseResonseのコードを見てみます.
3.Data Paresonse.javaファイルコードは以下の通りです.
4.Group Entity.javaファイルコードは以下の通りです.
コードの中で@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ファイルコードは以下の通りです.
Member Entityコードのコードコメントはここでは多くなく、原理は他の実体類と一致しています.
解析したデータをExpandable ListViewで表示するには、Expandable ListView対応のアダプターを作成し、解析したエンティティ類形式のデータを充填する必要があります.アダプターExpandAdapterのコードを見に来ました.
6.ExpandAdapter.javaファイルコードは以下の通りです.
したがって、MainActivityでパーサートビーンを呼び出して解析を完了した後、解析したエンティティ類をアダプタに充填し、Expandable ListViewで表示します.プロジェクト中のView Holderはカスタムクラスであり、Adapterクラスで頻繁にView Holderを作成しないために存在する.
7.View Holder.javaファイルコードは以下の通りです.
二番目です.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ファイルコードは以下の通りです.
次に、ホームページのコードを見ます.
3.MainActivity.javaファイルコードは以下の通りです.
MainActivityでは、Match AndPartseData方法でSAX解析xmlデータを実現します.SAX解析xmlデータは、Default Handler 2を継承するクラスをどのように作成するかがポイントです.プロジェクトで作成されたData PareseHandler類を見に来ました.
4.Data PartseHandler.javaファイルコードは以下の通りです.
DataPareseHandlerのgetResult()メソッドは、解析されたxmlデータが成功した後のエンティティセットを取得することができます.創xml解析データに対応するDataParsseHandler類の後に、この類のオブジェクトと解析が必要なxmlデータを関連付ける必要があり、XmlParUtilツール類があります.
5.Xml ParUtil.javaファイルコードは以下の通りです.
まとめ: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ファイルの内容は以下の通りです.
2.MainActivity.javaファイルコードは以下の通りです.
コードの中で、parseJson Data方法はjackson形式のデータを解析することを実現して、Object Mapperはjacksonから来て、mObject Mapperの対象readValue関数を呼び出してjsonデータに対する解析を実現することができます.JsonseEntity本体のコードを見てみます.
3.JsonseEnttity.javaファイルのコードは以下の通りです.
以上がJackson解析に関する実体類です.MainActivityのparseJson法により、jsonデータをパッケージ化したDataJson ResonseEntityに解析することができます.
四です.jacksonデータ変換解析 jacksonパッケージは単純な解析だけでなく、双方向解析もできます.jsonデータをmapマッピングなどに解析することもできます.次に、Jacksonカバンのjsonとbean(実体類)、Mapとjsonの双方向解析について紹介します.
以下はDemoプロジェクトファイル全体のスクリーンショットです.
プロジェクトの中で、astesディレクトリの中のjsonDataファイルの内容はいくつかの関連している販売報告書のデータです.
1.jsonDataファイルの内容は以下の通りです.
2.MainActivity.javaファイルコードは以下の通りです.
MainActvityでは、パースMapToJson、パースJson ToMap、パーサーンToJson、parseBenToJsonなどを通じて、jsonとbean、mapとjsonの間の解析変換を実現します.その他の関連する解析エンティティ類のコードは貼り出されません.原理は同じです.
本ブログ関連の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プロジェクトファイル全体のスクリーンショットです.
プロジェクトの中で、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の間の解析変換を実現します.その他の関連する解析エンティティ類のコードは貼り出されません.原理は同じです.