本教程介绍了如何在Android上使用JSONJSON 代表(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数据有效:

android json 服务器 安卓json文件放在哪_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);
    ....
}