本教程介绍了如何在Android上使用JSON 。 JSON 代表(Java脚本对象表示法)。 它是一种简单且轻量级的数据交换格式,可以由人和机器轻松读取。 JSON 是一种独立于语言的文本格式。 它以文本格式表示数据,因此可以轻松对其进行解析。
JSON简介
JSON使用两种不同的结构:
- 名称/值对的集合
- 数组
第一种结构可用于对对象建模,因为对象是保存一些值的属性的集合。 数组可用于建模列表,对象数组等。 因此,使用这两种结构,我们可以以简单有效的方式在两台机器之间传输数据。 最近,JSON取得了巨大的成功,并且大多数可用的API都支持JSON格式。 让我们看看如何用JSON表示数据。
{..} 进行建模,而属性可以使用 name:值对进行建模 。Value可以是对象,数组或“简单”值,例如原始值(int,字符串,布尔值等)。
因此,如果我们有一个像这样的java类:
public class Person {
private String name;
private String surname;
.....
}
可以用JSON表示
{"surname":"Swa",
"name":"Android",
....
}
数组使用[..]表示为JSON。 数组元素可以是对象,数组等。
现在我们知道了更好的JSON格式,我们可以开始在Android中使用JSON了。
在Android中使用JSON
在Android中以及通常在所有环境中,都有两种类型的操作:
- 将Java类转换为JSON数据 (序列化)
- 解析JSON数据并创建Java类(反序列化)
假设我们必须使用HTTP连接将数据发送到远程服务器,并且数据在java类中表示。 首先,我们将Java类转换为JSON数据。 例如,假设我们有一个这样的Person类:
public class Person {
private String name;
private String surname;
private Address address;
private List<PhoneNumber> phoneList;
// get and set
public class Address {
private String address;
private String city;
private String state;
// get and set
}
public class PhoneNumber {
private String type;
private String number;
// get and set
}
}
如您所见,该类几乎涵盖了所有对象类型:字符串,数组,内部类等等。 如何将其转换为JSON? 让我们创建一个实用程序类。
public class JsonUtil {
public static String toJSon(Person person) {
try {
// Here we convert Java Object to JSON
JSONObject jsonObj = new JSONObject();
jsonObj.put("name", person.getName()); // Set the first name/pair
jsonObj.put("surname", person.getSurname());
JSONObject jsonAdd = new JSONObject(); // we need another object to store the address
jsonAdd.put("address", person.getAddress().getAddress());
jsonAdd.put("city", person.getAddress().getCity());
jsonAdd.put("state", person.getAddress().getState());
// We add the object to the main object
jsonObj.put("address", jsonAdd);
// and finally we add the phone number
// In this case we need a json array to hold the java list
JSONArray jsonArr = new JSONArray();
for (PhoneNumber pn : person.getPhoneList() ) {
JSONObject pnObj = new JSONObject();
pnObj.put("num", pn.getNumber());
pnObj.put("type", pn.getType());
jsonArr.put(pnObj);
}
jsonObj.put("phoneNumber", jsonArr);
return jsonObj.toString();
}
catch(JSONException ex) {
ex.printStackTrace();
}
return null;
}
让我们分析一下代码。 在第6行,我们创建了一个新的JSON对象,它充当我们数据的容器。 接下来,我们放置一些名称/值对(第7-8行)。 如您所见,它们与Person类的属性匹配。 查看Person类的第10行,我们注意到我们有一个内部类,因此我们需要另一个JSON对象来表示它(第10-13行)。 构建JSON对象后,将其放在主对象第16行中。在第17行中,Person类中有一个电话列表。 在这种情况下,我们需要一个JSONArray来对java List进行建模,对于列表中的每个项目,我们都需要JSON Object进行映射。 运行本文结尾处提供的源代码,我们将具有:
{
"phoneNumber": [
{
"type": "work",
"num": "11111"
},
{
"type": "home",
"num": "2222"
}
],
"address": {
"state": "World",
"address": "infinite space, 000",
"city": "Android city"
},
"surname": "Swa",
"name": "Android"
}
这是我们的Person对象的JSON表示形式。 我使用了一个不错的网站来帮助测试JSON数据( http://www.jsontest.com/ )。 从结果中可以看到,我们的JSON数据有效:
解析JSON数据:反序列化
另一个有趣的方面是解析JSON数据并创建Java类。 即使有自动工具根据JSON数据创建POJO类,也要知道背后的内容,这一点很重要。 当您拥有JSON数据时,第一步是实例化一个解析器,该解析器有助于获取JSON中的值。
JSONObject jObj = new JSONObject(data);
数据包含JSON字符串的位置。 现在查看JSON数据文件,我们可以开始提取数据。 例如,如果我们假设获得了与上面显示的JSON数据类似的JSON数据(请参阅JSON Person数据),并且我们想要获得姓氏:
String surname = jObj.getString("surname");
当我们要获取地址对象时,可以使用:
JSONObject subObj = jObj.getJSONObject("address");
String city = subObj.getString("city");
...
如果我们要获取电话号码列表,我们只需:
JSONArray jArr = jObj.getJSONArray("list");
for (int i=0; i < jArr.length(); i++) {
JSONObject obj = jArr.getJSONObject(i);
....
}