JS和JAVA使用JSON方法解析
一.JS部分==================
将json字符串转换为json对象的方法。在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键。
例如:
JSON字符串:
var str1 = '{ "name": "cxh", "sex": "man" }';
JSON对象:
var str2 = { "name": "cxh", "sex": "man" };
一、JSON字符串转换为JSON对象
要使用上面的str1,必须使用下面的方法先转化为JSON对象:
//由JSON字符串转换为JSON对象 var obj = eval('(' + str + ')');
或者
//由JSON字符串转换为JSON对象 var obj = str.parseJSON();
或者
//由JSON字符串转换为JSON对象 var obj = JSON.parse(str);
然后,就可以这样读取:
Alert(obj.name); Alert(obj.sex);
特别注意:如果obj本来就是一个JSON对象,那么使用eval()函数转换后(哪怕是多次转换)还是JSON对象,但是使用parseJSON()函数处理后会有问题(抛出语法异常)。
二、可以使用toJSONString()或者全局方法JSON.stringify()将JSON对象转化为JSON字符串。
例如:
//将JSON对象转化为JSON字符 var last=obj.toJSONString();
或者
//将JSON对象转化为JSON字符 var last=JSON.stringify(obj); alert(last);
注意:
上面的几个方法中,除了eval()函数是js自带的之外,其他的几个方法都来自json.js包。新版本的 JSON 修改了 API,将 JSON.stringify() 和 JSON.parse() 两个方法都注入到了 Javascript 的内建对象里面,前者变成了 Object.toJSONString(),而后者变成了 String.parseJSON()。如果提示找不到toJSONString()和parseJSON()方法,则说明您的json包版本太低。
二.JAVA部分===============
1. json-lib是一个java类库,提供将Java对象,包括beans, maps, collections, java arrays and XML等转换成JSON,或者反向转换的功能。
2. json-lib 主页 : http://json-lib.sourceforge.net/
3.执行环境
需要以下类库支持(Maven构建)
pom.xml <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency>
下表中是Java与JavaScript类型对应关系。
代码示例:
注:在将 Json 形式的字符串转换为 JavaBean 的时候需要注意 JavaBean 中必须有无参构造函数,否则会报如下找不到初始化方法的错误
JavaBean代码:
package com.ppl.jsonconvert; public class Student {//姓名 private String name; //年龄 private String age; //住址 private String address; //在将 Json 形式的字符串转换为 JavaBean 的时候需要注意 JavaBean 中必须有无参构造函数,否则会报如下找不到初始化方法的错误 public Student() { super(); } public Student(String name, String age, String address) { super(); this.name = name; this.age = age; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", address=" + address + "]"; } }
提供两个工具类,json转换map的实现方法,有点儿简单,应付简单的需求没问题
/*** * 将json格式的字符串解析成Map对象 * @param object * JSON字符串 * @return Map集合 */ public static Map<String, String> toHashMap(Object object) { LinkedHashMap<String, String> dataMap = new LinkedHashMap<String, String>(); // 将json字符串转换成jsonObject JSONObject jsonObject = JSONObject.fromObject(object); Iterator it = jsonObject.keys(); // 遍历jsonObject数据,添加到Map对象 while (it.hasNext()) { String key = String.valueOf(it.next()); String value = (String) jsonObject.get(key); dataMap.put(key, value); } return dataMap; }
/** * * json转换map. * <br>详细说明 * @param jsonStr json字符串 * @return * @return Map<String,Object> 集合 * @throws * @author slj */ public static Map<String, Object> parseJSON2Map(String jsonStr){ ListOrderedMap map = new ListOrderedMap(); //最外层解析 JSONObject json = JSONObject.fromObject(jsonStr); for(Object k : json.keySet()){ Object v = json.get(k); //如果内层还是数组的话,继续解析 if(v instanceof JSONArray){ List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); Iterator<JSONObject> it = ((JSONArray)v).iterator(); while(it.hasNext()){ JSONObject json2 = it.next(); list.add(parseJSON2Map(json2.toString())); } map.put(k.toString(), list); } else { map.put(k.toString(), v); } } return map; }
测试代码:
package com.ppl.jsonconvert; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import com.ppl.json.commons.JsonUtils; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class Test { @SuppressWarnings({ "unused", "rawtypes", "unchecked" }) public static void main(String[] args) { ///****************************** //普通java实体类转化为JSON字符串形式 ///****************************** Student stu=new Student(); stu.setName("JSON"); stu.setAge("23"); stu.setAddress("北京市西城区"); //1、使用JSONObject JSONObject jsonObject = JSONObject.fromObject(stu); String strJson=jsonObject.toString(); //strJson:{"address":"北京市西城区","age":"23","name":"JSON"} System.out.println("strJson:"+strJson); //2、使用JSONArray JSONArray jsonArray=JSONArray.fromObject(stu); String strArray=jsonArray.toString(); //strArray:[{"address":"北京市西城区","age":"23","name":"JSON"}] System.out.println("strArray:"+strArray); ////////////////// ///****************************** //JSON字符串--》》java对象 ///****************************** //定义两种不同格式的字符串 String objectStr="{\"name\":\"JSONStu1\",\"age\":\"18\",\"address\":\"北京市西城区\"}"; String arrayStr="[{\"name\":\"JSONStu2\",\"age\":\"22\",\"address\":\"济南市历城区\"}]"; //1、使用JSONObject--将文字列转换为JSON JSONObject jsonObject2=JSONObject.fromObject(objectStr); Student stu2=(Student)JSONObject.toBean(jsonObject2, Student.class); System.out.println("stu2:"+stu2); //2、使用JSONArray--将文字列转换为JSON JSONArray jsonArray2=JSONArray.fromObject(arrayStr); //获得jsonArray的第一个元素 Object o=jsonArray2.get(0); JSONObject jsonObject3=JSONObject.fromObject(o); Student stu3=(Student)JSONObject.toBean(jsonObject3, Student.class); System.out.println("stu3:"+stu3); ///****************************** //Map转换成json, 大多使用jsonObject(注1) ///****************************** //不建议使用出自于 org.apache.commons.collections.OrderedMap //Map<String, Integer> ordermap = (Map<String, Integer>)new ListOrderedMap(); //有序的Map Map ordermap = new LinkedHashMap<String, String>(); Map map = new HashMap<String,Object>(); map.put( "name", "json" ); map.put( "bool", Boolean.TRUE ); map.put( "int", new Integer(1) ); map.put( "arr", new String[]{"a","b"} ); map.put( "func", "function(i){ return this.arr[i]; }" ); JSONObject jsonObjectMap = JSONObject.fromObject( map ); System.out.println( "Map转换成json:"+jsonObjectMap ); //注1示例详解 Student stu4=new Student("JSON","28","上海"); Map<String,Student> map4=new HashMap<String,Student>(); map4.put("first", stu4); //1、JSONObject JSONObject mapObject=JSONObject.fromObject(map4); System.out.println("mapObject"+mapObject.toString()); //2、JSONArray JSONArray mapArray=JSONArray.fromObject(map4); System.out.println("mapArray:"+mapArray.toString()); ///****************************** //list--》》json字符串,使用JSONArray ///****************************** Student stu5=new Student("student1","16","jinan"); Student stu6=new Student("student2","26","qingdao"); List<Student> lists=new ArrayList<Student>(); lists.add(stu5); lists.add(stu6); //1、 使用JSONArray JSONArray listArray=JSONArray.fromObject(lists); System.out.println("listArray:"+listArray.toString()); ///****************************** //json字符串--》》list ///****************************** String arrayStr2="[{\"name\":\"JSON\",\"age\":\"24\",\"address\":\"济南高新区\"}]"; //转化为list List<Student> list2=(List<Student>)JSONArray.toList(JSONArray.fromObject(arrayStr2), Student.class); for (Student stus : list2) { System.out.println(stus); } //最新的方法json字符串--》》list JSONArray jsonArrayT = JSONArray.fromObject(arrayStr2); List<Student> listData = (List) JSONArray.toCollection(jsonArrayT, Student.class); for (Student stus : listData) { System.out.println("listData: "+stus); } //转化为数组 Student[] ss =(Student[])JSONArray.toArray(JSONArray.fromObject(arrayStr),Student.class); for (Student student : ss) { System.out.println(student); } ///****************************** //json字符串--》》Map ///****************************** //BUG___________________TODO----------BUG String strObject="{\"KEY\":{\"address\":\"中国上海\",\"age\":\"23\",\"name\":\"JSON\"}}"; Map<String, String> dataMap = JsonUtils.toHashMap(strObject); System.out.println(dataMap.toString()); } }