《老罗Android》学习之JSON数据解析(一)

什么是JSON?
 1. JSON:JavaScript Object Notation;
 2. JSON数据是一系列键值对的集合; 轻量级的数据格式,数据都是 String类型。
 3. JSON已经被大多数开发人员接受,在网络数据的传输当中应用非常广泛;
 4. JSON相对于XML来谟解析稍微方便一些;
JSON  VS XML
 1.JSON和XML的数据可读性基本相同;
 2. JSON和XML同样拥有在写的解析手段;
 3. JSON相对于xml来讲,数据体积小;
 4. JSON与JavaSript的交互更加方便;
 5. JSON对数据的描述性相对较差。
JSON的一个例子:
{
    "name":"Michael",
    "address":
    {
        "city":"Beijing",
        "street":"Chaoyang Road",
        "postcode":100025
    }
}
一对‘{ }’就是一个JSON对象,可以看到它们可以嵌套。
{
"学生":
    [
        {"姓名":"小明","年龄":23},
        {"姓名":"大憨","年龄":24}
    ]
}
‘[ ]’ JSON数组。
使用Gson API解析JSON数据的方法
上代码:
MainActivity.java
public class MainActivity extends Activity {
	private Button button = null;
	private String jsonData = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button = (Button)findViewById(R.id.buttonId);
        button.setOnClickListener(new ButtonListener());
    }
    
    private class ButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			JsonUtils jsonUtils = new JsonUtils();
			jsonUtils.parseUserFromJson(jsonData);
		}    	
    }    
}
User.java
package mars.json03;
public class User {
	private String name ;
	private int age ;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
JsonUtils.java
public class JsonUtils {	
	public void parseUserFromJson(String jsonData){
		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("name--->" + user.getName());
			System.out.println("age---->" + user.getAge());
		}		
	}
}

例二:JSP+servlet 作服务器 生成JSON字符串,客户端解析 JSON数据。

架构如图:
1.建立一个web project.

2.把 json-lib-2.4-jdk15-javadoc 包放到工程目录的lib下。
3. JsonTools.java
public class JsonTools {
	public JsonTools() {
	}
	/**通过key和value,生成JSON格式。
	  * @param key    表示json字符串的头信息
	 * @param object  是对解析的集合的类型
	 * @return
	 */
	public static String createJsonString(String key, Object value) {
		JSONObject jsonObject = new JSONObject();
		jsonObject.put(key, value);
		return jsonObject.toString();
	}
}
4. Person.java
自动生成构造方法:    右键-->source---->Generate Constructor using Fields...
自动生成 get/set方法: 右键--->source ----> Generate Gettings and Settings....
自动生成 toStinr()的方法: 右键---> source --->Generate toString()....
public class Person {
	private int id;
	private String name;
	public Person(int id, String name, String address) {
		super();
		this.id = id;
		this.name = name;
		this.address = address;
	}
	private String address;
	public int getId() {
		return id;
	}
	@Override
	public String toString() {
		return "Person [address=" + address + ", id=" + id + ", name=" + name
				+ "]";
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	public Person() {
	}
}
5. JsonService.java
public class JsonService {
	public JsonService() {
	}
	public Person getPerson() { //生成一个person对象并赋值
		Person person = new Person(1001, "jack", "beijing");
		return person;
	}
	public List<Person> getlistPerson() {//得到一个Person类型的列表
		List<Person> list = new ArrayList<Person>();
		Person person1 = new Person(1001, "jack", "guangxi");
		Person person2 = new Person(1002, "rose", "guangdong");
		list.add(person1);
		list.add(person2);
		return list;
	}
	public List<String> getListString() { //不用person类,直接用list赋值
		List<String> list = new ArrayList<String>();
		list.add("beijing");
		list.add("shanghai");
		list.add("hunan");
		return list;
	}
	public List<Map<String, Object>> getListMaps() {//运用Map来传递值
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("id", 1001);
		map1.put("name", "jack");
		map1.put("address", "beijing");
		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("id", 1002);
		map2.put("name", "rose");
		map2.put("address", "shanghai");
		list.add(map1);
		list.add(map2);
		return list;
	}
}
6. TestJson.java
进行测试
public class TestJson {
	public TestJson() {
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String msg = "";
		JsonService service = new JsonService();
//		// Person person = service.getPerson();
//		// msg = JsonTools.createJsonString("person", person);
//		// System.out.println(msg);
		msg = JsonTools.createJsonString("persons", service.getListMaps());
		System.out.println(msg);
	}
}
结束分别为:service.getlistPerson() ---->  {"persons":[{"address":"guangxi","id":1001,"name":"jack"},{"address":"guangdong","id":1002,"name":"rose"}]}
service.getListString()-------->   {"persons":["beijing","shanghai","hunan"]}
service.getListMaps()-------->{"persons":[{"id":1001,"address":"beijing","name":"jack"},{"id":1002,"address":"shanghai","name":"rose"}]}

7. 客户端 JSON数据提取时,做下扩充

JDBC:把数据从数据库中提取出来,是单条记录或某个集合,服务器需要把这些数据生成JSON格式,在客户端就可以去解析这些数据,放在手机上显示出来。

我们把这方法放在一个Servlet中。

JsonServlet.java:

@WebServlet("/JsonServlet")
public class JsonServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private JsonService service;  
    public JsonServlet() {
        super();
    }
    @Override
    public void destroy() {
    	super.destroy();
    }	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		String jsonString = "";
//		1. jsonString = JsonTools.createJsonString("person", service.getPerson());
		String action_flag = request.getParameter("action_flag");
		if (action_flag.equals("person")) {
			jsonString = JsonTools.createJsonString("person", service
					.getPerson());
		} else if (action_flag.equals("persons")) {
			jsonString = JsonTools.createJsonString("persons", service
					.getlistPerson());
		} else if (action_flag.equals("liststring")) {
			jsonString = JsonTools.createJsonString("liststring", service
					.getListString());
		} else if (action_flag.equals("listmap")) {
			jsonString = JsonTools.createJsonString("listmap", service
					.getListMaps());
		}
		out.println(jsonString);
		out.flush();
		out.close();
	}
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		service = new JsonService();
	}
}
第一种,在浏览器中输入:http://192.168.0.221:8080/jsonProject/JsonServlet,就可得到JSON数据:{"address":"beijing","id":1001,"name":"jack"}}。

多种情况的代码的访问方式:http://192.168.0.221:8080/jsonProject/JsonServlet?action_flag=liststring ;改变这个action_flag就可以得到不同的数据。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值