您的位置:首页 > 编程语言 > Java开发

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.JSONArray

Android中 JSON相关的类(4个)和Exceptions(1个):

l JSONArrayl JSONObjectl JSONStringerl JSONTokenerl JSONException

JSONObject:

这是系统中有关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文件;运行结果如下图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: