4. 4
JSON Parsing
● Hiện nay rất nhiều Web service cung cấp dữ liệu
dưới định dạng JSON. Do đó chúng ta cần
chuyển chuỗi kí tự dưới định dạng JSON thành
các đối tượng Java để có thể sử dụng trong
chương trình. Quá trình này gọi là JSON
parsing.
● Android cung cấp package org.json trong đó có
2 class chính JSONObject và JSONArray giúp
chúng ta thực hiện JSON parsing dễ dàng.
5. 5
JSON Parsing
● JSONObject:
● JSONObject là class đại điện cho một đối tượng
trong chuỗi JSON.
● Một đối tượng trong chuỗi JSON được bọc trong cặp
dấu ngoặc nhọn “{“,”}”.
● Để tạo ra đối tượng JSONObject chúng ta sử dụng
phương thức khởi tạo và truyền chuỗi JSON biểu
diễn đối tượng đó vào tham số thứ nhất.
● JSONObject cung cấp các phương thức getter để
chúng ta truy xuất đến các thuộc tính của nó:
JSONObject#getXXX(String key)
6. 6
JSON Parsing
● JSONObject:
● Danh sách các phương thức getter thường sử dụng:
– getDouble
– getInt
– getLong
– getString
– get
– getBoolean
– getJSONArray
– getJSONObjects
7. 7
JSON Parsing
● JSONArray:
● Là class đại diện cho array trong chuỗi JSON.
● Array trong chuỗi JSON là một đối tượng được bọc
trong cặp ngoặc vuông “[“, “]”.
● Để tạo ra đối tượng JSONArray chúng ta sử dụng
phương thức khởi tạo và truyền chuỗi JSON biểu
diễn nó vào tham số thứ nhất.
● JSONArray cũng cung cấp các phương thức getter
giống như JSONObject để truy xuất giá trị các thuộc
tính.
8. 8
JSON Parsing
● Ví dụ:
● Chúng ta cần viết chương trình để parse đoạn JSON
sau đây:
[
{
“name”:”Nguyen Van A”,
“old”:”17”
},
{
“name”:”Nguyen Van B”,
“old”:”80”
}
]
9. 9
JSON Parsing
● Các bước để parse như sau:
1.Tạo JSONArray từ chuỗi JSON đã cho.
2. Sử dụng vòng lặp for để xử lý cho các JSONObject
bên trong.
3. Lấy JSONObject từ JSONArray qua các bước lặp.
4.Sử dụng phương thức getter phù hợp để lấy giá trị.
10. 10
JSON Parsing
● Đoạn chương trình mẫu như sau:
import org.json.JSONArray;
import org.json.JSONObject;
・・・
try {
JSONArray objects = new JSONArray(jsonstring);
for (int i = 0; i < objects.length(); i++) {
JSONObject person = objects.getJSONObject(i);
Log.d(“JSON”,“name:" + person.getString(“name") );
Log.d(“JSON”,“old:" + person.getString(“old") );
Log.d(“JSON”,"======================");
}
} catch (Exception e) {
}
・・・
15. 15
XML Parsing
● Giới thiệu các phương pháp parse XML
● DOM (Document Object Model)
– Sử dụng cấu trúc cây, lưu trữ trên bộ nhớ heap.
– Tất cả nội dung của tập tin cần parse được chứa trong bộ
nhớ và sau khi parse xong chúng ta có thể truy xuất đến
bất kỳ một phần tử vào bất cứ lúc nào.
– Do phải lưu nội dung của tập tin XML trên bộ nhớ nên đòi
hỏi bộ nhớ phải lớn đây là một hạn chế trên các thiết bị di
động.
– Do đó phương pháp này chỉ phù hợp cho các trường hợp
tập tin XML cần parse có dung lượng nhỏ.
16. 16
XML Parsing
● Giới thiệu các phương pháp parse XML
● SAX (Simple API for XML)
– SAX dựa trên các sự kiện khi parse.
– Chương trình parse (parser) đọc tập tin XML cần parse từ
đầu tập tin và cứ mỗi lần một sự kiện như mở, đóng một
tag thì callback function trong chương trình được gọi để
thực thi.
– Phía chương trình không điều khiển được việc đọc tập tin
XML như DOM.
– Phương pháp này ít tốn vùng nhớ hơn DOM.
– Trong Android có hai cách sử dụng SAX: cách thông
thường hay cách sử dụng wrapper.
17. 17
XML Parsing
● Giới thiệu các phương pháp parse XML
● XMLPullParser (XPP)
– XPP dựa trên mô hình pull(khi nào cần mới parse, có thể
điều khiển quá trình parse). XPP giống như StAX như
trong Java. Android không hỗ trợ StAX mà hỗ trợ XPP.
– Chương trình parse (parser) đọc tập tin XML cần parse từ
đầu tập tin và quá trình parse có thể điều khiển từ chương
trình.Thông tin có thể lấy từ parser nếu cần..
– Do quá trình parse có thể điều khiển từ phía chương trình
cho nên việc parse có thể dừng lại sớm, tiết kiệm thời
gian.
18. 18
XML Parsing
● Giới thiệu các phương pháp parse XML
DOM SAX XMLPullParser
Cấu trúc parser Cấu trúc cây Dựa vào kiểu sự
kiện (không điều
khiển được)
Dựa vào kiểu sự kiện
(điều khiển được)
Truy xuất phần tử Truy xuất bất kì Truy xuất tuần tự Truy xuất tuần tự
Lấy thông tin phần tử Truy xuất cây DOM Qua hàm callback Truy xuất qua vòng lặp
Ghi vào tập tin Có thể Không thể Có thể
Chi phí bộ nhớ Nhiều Ít nhất Ít
Dễ sử dụng Dễ Khó Dễ
19. 19
XML Parsing
● XML file dùng để demo (sample.xml) có nội
dung:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<node>Node Value</node>
</root>
21. 21
XML Parsing
● DOM:
● Để parse XML sử dụng DOM, tiến hành các bước
sau:
– Get đối tượng Document từ XML data:
● Tạo đối tượng DocumentBuilderFactory
● Tạo đối tượng DOMParser
● Phân tích XML và xây dựng DOM tree.
– Truy xuất phần tử gốc của cây.
– Truy xuất phần tử bất kỳ trong cây.
– Truy xuất dữ liệu đang lưu trữ trong nút của cây.
22. 22
XML Parsing
● DOM:
InputStream in = null;
try {
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbfactory.newDocumentBuilder();
in = getAssets().open("sample.xml");
Document doc = builder.parse(in);
//Truy xuat phan tu goc <root>
Element root = doc.getDocumentElement();
// Get <node>
NodeList entryList = root.getElementsByTagName("node");
//Lay nut dau tien trong danh sach cac nut <node>
Element nodeElement = (Element) entryList.item(0);
// Gia tri luu tru o <node>
String nodevalue = nodeElement.getFirstChild().getNodeValue();
Log.v(“DOM”, nodevalue);
} catch (Exception e) {
//Xử lý exception
}
24. 24
XML Parsing
● SAX
● Các bước thực hiện:
1.Tạo event handler class, lớp này nhận callback từ
SAXParser.
2. Tạo đối tượng SAXParserFactory và tạo đối tượng
SAXParser.
3.Set event handler tạo ở bước 1 cho SAXParser.
4.Tiến hành parse xml bằng cách gọi phương thức
SAXParser#parse
5.Mỗi khi một sự kiện xảy ra nó sẽ gọi callback tương ứng
trong event handler được tạo ra ở bước 1.
25. 25
XML Parsing
● SAX
● Các bước thực hiện:
1.Tạo event handler class, lớp này nhận callback từ
SAXParser:
Tạo class thừa kế từ class DefaultHandler.
Hiện thực các callback tương ứng với từng sự kiện:
Start tag → startElement
End tag → endElement
Text trong 1 tag → character
26. 26
XML Parsing
● SAX class SaxHandler extends DefaultHandler {
//Tag starting flag
boolean isNode;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("node".equals(localName)) {
// Start node tag
isNode= true;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("node".equals(localName)) {
// End node tag
isNode= false;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//If node tag is started, output text string to log
if (isNode) {
String nodevalue = new String(ch, start, length);
Log.v(“SAX”, nodevalue);
}
}
}
27. 27
XML Parsing
● SAX
// Create factory of parse
SAXParserFactory saxParaser = SAXParserFactory.newInstance();
Try {
InputStream in = getAssets().open("sample.xml");
/* Get parser */
SAXParser sp = saxParaser.newSAXParser();
/* Create event handler */
SaxHandler sh = new SaxHandler();
/* Pass the input data and event handler to event handler */
sp.parse(in, sh);
} catch (Exception e) {
Log.e(“SAX”,”Error:”,e);
}
29. 29
XML Parsing
● XmlPullParser:
● Các bước để parse xml bằng XmlPullParser:
– Tạo đối tượng XmlPullParser.
– Truyền nội dung của tập tin XML cần parse cho parser.
– Lấy được các sự kiện và phân tích.
30. 30
XML Parsing
● XmlPullParser:
InputStream in = null;
try {
// Get stream of analyzing target
in = getAssets().open("sample.xml");
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(new InputStreamReader(in));
parser.next(); // root tag
parser.next(); // node tag
String tag = parser.getName();
if ("node".equals(tag)) {
parser.next();
String nodevalue = parser.getText();
Log.v(“XMLParser”, nodevalue);
}
} catch (Exception e) {
//Xu ly exception
}