JAVA中使用JSON进行数据传递
2015-06-12 15:49
537 查看
最近在做一个基于JAVA Servlet的WEB应用以及对应的Anroid应用客户端的开发工作。其中,在接口的访问和数据的传输方面使用的比较多的是使用JSON对象来操作格式化数据:在服务器端采用JSON字符串来传递数据并在WEB前端或者Android客户端使用JSON来解析接收到的数据。首先,在JAVA中使用JSON需要引入 org.json 包(点击这里 可以下载相应的JAR包!), 并在程序中引入相应的JSON类:
1 import org.json.JSONArray; 2 import org.json.JSONException; 3 import org.json.JSONObject;其次,在服务器端的Servlet类中,可以使用如下方法收集数据并生成相应的JSON字符串
1 //声明一个Hash对象并添加数据 2 Map params = new HashMap(); 3 4 params.put("username", username); 5 params.put("user_json", user); 6 7 //声明JSONArray对象并输入JSON字符串 8 JSONArray array = JSONArray.fromObject(params); 9 put.println(array.toString());在WEB前端可以通过javascript直接对JSON字符串进行解析,在Android客户端的话,需要使用JSON类来解析字符串:
1 //@description: 根据接收到的JSON字符串来解析字符串中所包含的数据和数据对象 2 3 //接收到的JSON字符串 4 String result = "[{\"username\": \"your name\", \"user_json\": {\"username\": \"your name\", \"nickname\": \"your nickname\"}}]"; 5 6 //根据字符串生成JSON对象 7 JSONArray resultArray = new JSONArray(result); 8 JSONObject resultObj = resultArray.optJSONObject(0); 9 10 //获取数据项 11 String username = resultObj.getString("username"); 12 13 //获取数据对象 14 JSONObject user = resultObj.getJSONObject("user_json"); 15 String nickname = user.getString("nickname");其实,主要就是涉及到以下集中数据类型之间的转换:1. String 转换为JSON对象
1 import org.json.JSONArray; 2 import org.json.JSONException; 3 import org.json.JSONObject;45 //别忘了添加上JSON包哦!6 public class StringToJSON {7 public static void main(String[] args) throws JSONException{89 System.out.println("abc");10 //定义JSON字符串11 String jsonStr = "{\"id\": 2," +12 " \"title\": \"json title\", " +13 "\"config\": {" +14 "\"width\": 34," +15 "\"height\": 35," +16 "}, \"data\": [" +17 "\"JAVA\", \"JavaScript\", \"PHP\"" +18 "]}";1920 //转换成为JSONObject对象21 JSONObject jsonObj = new JSONObject(jsonStr);2223 //从JSONObject对象中获取数据24 JavaBean bean = new JavaBean();2526 //根据属性名称获取int型数据;27 bean.setId(jsonObj.getInt("id"));2829 //根据属性名获取String数据;30 bean.setTitle(jsonObj.getString("title"));3132 //根据属性名获取JSONObject类33 JSONObject config = jsonObj.getJSONObject("config");34 bean.setWidth(config.getInt("width"));35 bean.setHeight(config.getInt("height"));3637 //根据属性名获取JSONArray数组38 JSONArray data = jsonObj.getJSONArray("data");39 for(int index = 0, length = data.length(); index < length; index++) {40 //这里在org.json.JSONArray对象中居然没有找到toArray方法,求各位网友给出解决办法啊!41 // bean.setLanguages(String[]);42 }43 }44 }4546 class JavaBean{47 private int id ;48 private String title;49 private int width;50 private int height;51 private String[] languages;5253 //这里省略了设置器和访问器54 }2. JSON对象转换为String字符串
1 public static void main(String[] args) throws JSONException { 2 3 //创建JSONObject对象 4 JSONObject json = new JSONObject(); 5 6 //向json中添加数据 7 json.put("username", "wanglihong"); 8 json.put("height", 12.5); 9 json.put("age", 24); 10 11 //创建JSONArray数组,并将json添加到数组 12 JSONArray array = new JSONArray(); 13 array.put(json); 14 15 //转换为字符串 16 String jsonStr = array.toString(); 17 18 System.out.println(jsonStr); 19 }最终输出结果为: [{"username":"wanglihong","height":12.5,"age":24}]3. 集合转换为JSONArray对象
1 public static void main(String[] args)throws JSONException{ 2 //初始化ArrayList集合并添加数据 3 List<String> list = new ArrayList<String>(); 4 list.add("username"); 5 list.add("age"); 6 list.add("sex"); 7 8 //初始化HashMap集合并添加数组 9 Map map = new HashMap(); 10 map.put("bookname", "CSS3实战"); 11 map.put("price", 69.0); 12 13 //初始化JSONArray对象,并添加数据 14 JSONArray array = new JSONArray(); 15 array.put(list); 16 array.put(map); 17 18 //生成的JSON字符串为:[["username","age","sex"],{"price":69,"bookname":"CSS3实战"}] 19 }
JSON的结构:
Name/Value Pairs 类似所熟知的Keyed list、Hash table、Disctionary和Associative array。在Android平台中同时存在另外一个类“Bundle”,某种程度上具有相似的行为。org.json.JSONObject Array,一组有序的数据列表。org.json.JSONArrayAndroid中 JSON相关的类(4个)和Exceptions(1个):
l JSONArrayl JSONObjectl JSONStringerl JSONTokenerl JSONExceptionJSONObject:
这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之间是以逗号","分隔。 Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。 有两个不同的取值方法:get(): 在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception信息。opt(): 这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常。JSONArray:
它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。例子1: Array里面包含对象(object) [ {"id":1,"name":"小猪" ,"age”:22} ,{"id":2,"name":"小猫","age”:23}, .......]例子2:同样对象(object)中可以包含Array(1)一个对象包含1个数组,2个子对象 {"root":[{"id":"001","name":"小猪"},{"id":"002","name":"小猫"},{"id":"003","name":"小狗"}],"total":3,"success":true}(2)也可以对象嵌套子对象,子对象再嵌套数组 {"calendar":{"calendarlist":[{"id":"001","name":"小猪"},{"id":"002","name":"小猫"}]}}同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。JSONStringer:
根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。 根据下边的实例来了解其它相关信息:string myString = new JSONStringer().object().key("AR").value("www.Androidres.com!").endObject().toString();结果是一组标准格式的JSON text:{”AR”:”www.Androidres.com!”} 其中的.object()和.endObject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。JSONTokener:
这个是系统为JSONObject和JSONArray构造器解析JSON source string的类,它可以从source string中提取数值信息。JSONException:
是JSON.org类抛出的异常信息下面引用一个完整的应用实例:应用JSONObject存储Map类型数值:[java] view plaincopyprint?public class HelloJSONActivity extends Activity {/** Called when the activity is first created. */Button b_parse;TextView tv;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);tv= (TextView)findViewById(R.id.tv);b_parse = (Button)findViewById(R.id.parse_json);b_parse.setOnClickListener(new ParseJSONListener());}class ParseJSONListener implements OnClickListener{@Overridepublic void onClick(View v) {Map<String, Map<String, String>> maps = new HashMap<String, Map<String, String>>();Map<String, String> map = new HashMap<String, String>();map.put("0001", "a");map.put("0002", "b");map.put("0003", "c");Map<String, String> map2 = new HashMap<String, String>();map2.put("1001", "aa");map2.put("1002", "bb");map2.put("1003", "cc");maps.put("1", map);maps.put("2", map2);JSONObject jsonObjec = getJSON(maps);tv.setText(jsonObjec.toString());System.out.println(jsonObjec.toString());}}public static JSONObject getJSON(Map map) {Iterator iter = map.entrySet().iterator();JSONObject holder = new JSONObject();while (iter.hasNext()) {Map.Entry pairs = (Map.Entry) iter.next();String key = (String) pairs.getKey();Map m = (Map) pairs.getValue();JSONObject data = new JSONObject();try {Iterator iter2 = m.entrySet().iterator();while (iter2.hasNext()) {Map.Entry pairs2 = (Map.Entry) iter2.next();data.put((String) pairs2.getKey(), (String) pairs2.getValue());}holder.put(key, data);} catch (JSONException e) {Log.e("Transforming", "There was an error packaging JSON", e);}}return holder;}}配置main.xml文件;运行结果如下图:
相关文章推荐
- Java线程详解
- Groovy&Java multi Map 的引用
- java 位操作 bitwise(按位) operation bit
- 使用java将多种类型的文件如Word、PDF、JPG汇总到一个文档中(Word或者PDF)
- Eclipse如何切换SVN用户
- struts2 if标签示例
- struts2的应用
- hibernate在MyEclipse中的逆向工程
- Spring的依赖注入
- JavaEE6.0中非常重要的EJB3.1规范的新特性
- LeetCode_29---Divide Two Integers
- spring+springMVC事务不回滚
- java多态理解
- java读取properties配置文件
- MyEclipse使用指南介绍
- struts2基于注解的action
- Java 8 Optional类深度解析
- java 最大线程数
- Hibernate在MyEclipse中的配置
- MyEclipse10.0 采用插件方式安装 SVN