php返回json给android

php里面echo json_encode($data);

Android一般用gson解析。

http://blog.csdn.net/caijunjun1006/article/details/11762841

什么是JSON:

JSON即JavaScript Object Natation, 它是一种轻量级的数据交换格式, 与XML一样, 是广泛被采用的客户端和服务端交互的解决方案.

JSON对象: 

JSON中对象(Object)以”{“开始, 以”}”结束. 对象中的每一个item都是一个key-value对, 表现为”key:value”的形式, key-value对之间使用逗号分隔. 如:{“name”:”coolxing”, “age”=24, “male”:true, “address”:{“street”:”huiLongGuan”, “city”:”beijing”, “country”:”china”}}. JSON对象的key只能是string类型的, 而value可以是string, number, false, true, null, Object对象甚至是array数组, 也就是说可以存在嵌套的情况.

JSON数组: 

JSON数组(array)以”[“开始, 以”]”结束, 数组中的每一个元素可以是string, number, false, true, null, Object对象甚至是array数组, 数组间的元素使用逗号分隔. 如[“coolxing”, 24, {“street”:”huiLongGuan”, “city”:”beijing”, “country”:”china”}].

JSON数据的解析:

解析JSON数据, 首先需要明确待解析的是JSON Object还是JSON array, 然后需要确定采用哪种解析技术. android平台上一般有2种解析技术可供选择:android内置的org.json包和google的开源gson库. 以下将分别采用这两种技术解析JSON对象和JSON数组.

1.  采用android内置的org.json包解析JSON对象. 假设待解析的JSON数据为json = “{\”name\”:\”coolxing\”, \”age\”=24, \”male\”:true, \”address\”:{\”street\”:\”huiLongGuan\”, \”city\”:\”beijing\”, \”country\”:\”china\”}}”, 其中\用于转义表达式中的双引号. 首先定义2个JavaBean:

  1. package text.com.bean;
  2. public class Address {
  3.     private String street;
  4.     private String city;
  5.     private String country;
  6.     public Address() {
  7.         super();
  8.     }
  9.     public Address(String street, String city, String country) {
  10.         super();
  11.         this.street = street;
  12.         this.city = city;
  13.         this.country = country;
  14.     }
  15.     public String getStreet() {
  16.         return street;
  17.     }
  18.     public void setStreet(String street) {
  19.         this.street = street;
  20.     }
  21.     public String getCity() {
  22.         return city;
  23.     }
  24.     public void setCity(String city) {
  25.         this.city = city;
  26.     }
  27.     public String getCountry() {
  28.         return country;
  29.     }
  30.     public void setCountry(String country) {
  31.         this.country = country;
  32.     }
  33.     @Override
  34.     public String toString() {
  35.         return “Address [street=” + street + “, city=” + city + “, country=”
  36.                 + country + “]”;
  37.     }
  38. }

 

  1. package text.com.bean;
  2. public class Person {
  3.     private String name;
  4.     private int age;
  5.     private boolean male;
  6.     private Address address;
  7.     public Person() {
  8.         super();
  9.     }
  10.     public Person(String name, int age, boolean male, Address address) {
  11.         super();
  12.         this.name = name;
  13.         this.age = age;
  14.         this.male = male;
  15.         this.address = address;
  16.     }
  17.     public String getName() {
  18.         return name;
  19.     }
  20.     public void setName(String name) {
  21.         this.name = name;
  22.     }
  23.     public int getAge() {
  24.         return age;
  25.     }
  26.     public void setAge(int age) {
  27.         this.age = age;
  28.     }
  29.     public boolean isMale() {
  30.         return male;
  31.     }
  32.     public void setMale(boolean male) {
  33.         this.male = male;
  34.     }
  35.     public Address getAddress() {
  36.         return address;
  37.     }
  38.     public void setAddress(Address address) {
  39.         this.address = address;
  40.     }
  41.     @Override
  42.     public String toString() {
  43.         return “Person [name=” + name + “, age=” + age + “, male=” + male
  44.                 + “, address=” + address + “]”;
  45.     }
  46. }

首先使用方法一解析代码如下:

  1. JSONObject jsonObject = new JSONObject(json);
  2. String name = jsonObject.getString(“name”);
  3. int age = jsonObject.getInt(“age”);
  4. boolean male = jsonObject.getBoolean(“male”);
  5. JSONObject addressJSON = jsonObject.getJSONObject(“address”);
  6. String street = addressJSON.getString(“street”);
  7. String city = addressJSON.getString(“city”);
  8. String country = addressJSON.getString(“country”);
  9. Address address = new Address(street, city, country);
  10. Person person = new Person(name, age, male, address);
  11. System.out.println(person);

LogCat的输出为Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 说明已经正确解析了JSON对象.

2. 采用gson库解析JSON对象. 假设带解析的JSON数据是json = “{\”name\”:\”coolxing\”, \”age\”=24, \”male\”:true, \”address\”:{\”street\”:\”huiLongGuan\”, \”city\”:\”beijing\”, \”country\”:\”china\”}}”, 首先需要到http://code.google.com/p/google-gson/下载jar包, 并将其添加到项目中. 具体的解析代码如下:

  1. Gson gson = new Gson();
  2. Person person = gson.fromJson(json, Person.class);
  3. System.out.println(person);

LogCat的输出为Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 说明已经正确解析了JSON对象, 是不是很简单?

3. 采用android内置的org.json包解析JSON数组. 假设待解析的JSON数据为json = “[{\”name\”:\”coolxing\”, \”age\”=24, \”male\”:true, \”address\”:{\”street\”:\”huiLongGuan\”, \”city\”:\”beijing\”, \”country\”:\”china\”}}, {\”name\”:\”min\”, \”age\”=20, \”male\”:false, \”address\”:{\”street\”:\”heiShiJiao\”, \”city\”:\”daLian\”, \”country\”:\”china\”}}]”, 解析代码如下:

  1. List<Person> persons = new ArrayList<Person>();
  2. JSONArray jsonArray = new JSONArray(json);
  3. for(int i = 0; i < jsonArray.length(); i++) {
  4.     JSONObject jsonObject = jsonArray.getJSONObject(i);
  5.     String name = jsonObject.getString(“name”);
  6.     int age = jsonObject.getInt(“age”);
  7.     boolean male = jsonObject.getBoolean(“male”);
  8.     JSONObject addressJSON = jsonObject.getJSONObject(“address”);
  9.     String street = addressJSON.getString(“street”);
  10.     String city = addressJSON.getString(“city”);
  11.     String country = addressJSON.getString(“country”);
  12.     Address address = new Address(street, city, country);
  13.     Person person = new Person(name, age, male, address);
  14.     persons.add(person);
  15. }
  16. System.out.println(persons);

LogCat的输出为[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 说明已经正确解析了JSON数组.

4. 采用gson库解析JSON数组. 待解析的JSON数据同上, 具体代码为:

  1. Gson gson = new Gson();
  2. Type listType = new TypeToken<List<Person>>(){}.getType();
  3. List<Person> persons = gson.fromJson(json, listType);
LogCat的输出为[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 说明已经正确解析了JSON数组.
new TypeToken<List<Person>>(){}.getType(); 这句代码表示创建一个TypeToken的匿名子类对象, 并调用对象的getType()方法.
org.json包和gson库还有很多其他有用的API, 需要的时候可查看文档. 比如有的时候需要通过java对象或java集合和数组生成json数据上传给服务器, 当然你可以自我构造json字符串, 但会很麻烦. 这个时候就可以使用其中的有关API, 方便的完成这项工作.

测试用例:

  1. package text.com;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.InputStreamReader;
  6. import java.lang.reflect.Type;
  7. import java.util.List;
  8. import text.com.bean.Address;
  9. import text.com.bean.Person;
  10. import com.google.gson.Gson;
  11. import com.google.gson.reflect.TypeToken;
  12. public class JsonTest {
  13.     String jsonString = “”;
  14.     public static void main(String[] args) {
  15.         // Person p1 = new Person(“zhangsan”, 12, true, new Address(“北京”, “海淀区”,
  16.         // “30号”));
  17.         // Person p2 = new Person(“zhangsan”, 12, true, new Address(“北京”, “海淀区”,
  18.         // “30号”));
  19.         // Person p3 = new Person(“zhangsan”, 12, true, new Address(“北京”, “海淀区”,
  20.         // “30号”));
  21.         // List<Person> list = new ArrayList<Person>();
  22.         // list.add(p1);
  23.         // list.add(p2);
  24.         // list.add(p3);
  25.         // Gson gson = new Gson();
  26.         // Type typeOfT = new TypeToken<List<Person>>(){}.getType();
  27.         // String json = gson.toJson(list, typeOfT);
  28.         // System.out.println(“json:”+json);
  29.         // String str = readTxtFile(“D:\\cjjworkspace\\Test\\json.txt”);
  30.         // System.out.println(“文件内容:” + str);
  31.          Gson gson = new Gson();
  32.         // Type typeOfT = new TypeToken<List<Person>>(){}.getType();
  33.         // List<Person> personList = gson.fromJson(str, typeOfT);
  34.         Person p1 = new Person(“zhangsan”12truenew Address(“北京”“海淀区”“30号”));
  35.         Type typeOfT = new TypeToken<Person>(){}.getType();
  36.         String str = gson.toJson(p1, typeOfT);
  37.         System.out.println(str);
  38.     }
  39.     public static String readTxtFile(String filePath) {
  40.         String encoding = “utf-8”;
  41.         StringBuilder sb = new StringBuilder();
  42.         try {
  43.             File file = new File(filePath);
  44.             if (file.isFile() && file.exists()) { // 判断文件是否存在
  45.                 InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
  46.                 BufferedReader bufferedReader = new BufferedReader(read);
  47.                 String str = “”;
  48.                 while ((str = bufferedReader.readLine()) != null) {
  49.                     sb.append(str);
  50.                 }
  51.                 read.close();
  52.                 return sb.toString();
  53.             } else {
  54.                 System.out.println(“找不到指定的文件”);
  55.                 return null;
  56.             }
  57.         } catch (Exception e) {
  58.             System.out.println(“读取文件内容出错”);
  59.             e.printStackTrace();
  60.         }
  61.         return sb.toString();
  62.     }
  63. }

附带:gson-2.2.4.jar

gson-2.2.4-javadoc.jar

gson-2.2.4-sources.jar

http://www.itzhai.com/android-to-parse-json-data-using-gson.html

在Android中可以使用Gson解析JSON数据

首先,从 code.google.com/p/google-gson/downloads/list下载GsonAPI:

google-gson-1.7.1-release.zip

把gson-1.7.jar copy到libs(项目根目录新建一个libs文件夹)中。

可以使用以下两种方法解析JSON数据:

通过获取JsonReader对象解析JSON数据:

String jsonData = "[{\"username\":\"arthinking\",\"userId\":001},{\"username\":\"Jason\",\"userId\":002}]";
try{
	JsonReader reader = new JsonReader(new StringReader(jsonData));
	reader.beginArray();
	while(reader.hasNext()){
		reader.beginObject();
		while(reader.hasNext()){
			String tagName = reader.nextName();
			if(tagName.equals("username")){
				System.out.println(reader.nextString());
			}
			else if(tagName.equals("userId")){
				System.out.println(reader.nextString());
			}
		}
		reader.endObject();
	}
	reader.endArray();
}
catch(Exception e){
	e.printStackTrace();
}

通过把JSON数据映射成一个对象,使用Gson对象的fromJson()方法获取一个对象数组进行操作:

创建JSON数据对应的一个POJO对象User.java:

public class User {
	private String username ;
	private int userId ;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
}

使用Gson对象获取User对象数据进行相应的操作:

Type listType = new TypeToken<LinkedList<User>>(){}.getType();
Gson gson = new Gson();
LinkedList<User> users = gson.fromJson(jsonData, listType);
for (Iterator iterator = users.iterator(); iterator.hasNext();) {
	User user = (User) iterator.next();
	System.out.println(user.getUsername());
	System.out.println(user.getUserId());
}

如果要处理的JSON字符串只包含一个JSON对象,则可以直接使用fromJson获取一个User对象:

String jsonData = "{\"username\":\"arthinking\",\"userId\":001}";
Gson gson = new Gson();
User user = gson.fromJson(jsonData, User.class);
System.out.println(user.getUsername());
System.out.println(user.getUserId());

(特别说明:本文部分内容是在观看marschen的Android视频教程时做的笔记,感谢marschen推出的视频教程,这里也推荐给大家:http://www.marschen.com/portal.php)

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/android-to-parse-json-data-using-gson.html
关键字: , ,
arthinking 指弹吉他 && 技术 more