1.使用Google 的 gson方式解析json,园子里面对json方面的教程都非常多,很多写的都非常不错,借鉴不少,毕竟刚刚研究.
gson支持解析的类型还是比较全面的,包括JavaBean,List<JavaBean>,List<String>,Map等,使用起来也是比较方便.
首先配置环境,需要下载相应的jar包, 下面测试使用的版本是2.2.4.
官方下载地址:http://code.google.com/p/google-gson/
gson API:http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html
测试用例(源码附件GsonJson.zip,下载地址:http://pan.baidu.com/s/1qWHNjdU):
public class MyGson { private Gson gson = new Gson(); //java bean to json string @Test public void beanToJson(){ Person person = new Person(); person.setId(1); person.setName("zhanglu"); person.setAddress("湖北大悟"); System.out.println(gson.toJson(person)); } //json string to java bean @Test public void jsonTobean(){ String json = "{'id':'1','name':'zhang','address':'Hubei'}"; Person person = gson.fromJson(json, Person.class); System.out.println(person); } //list<bean> to json @Test public void listBeanToJson(){ Person person1 = new Person(1, "zhang", "Hubei"); Person person2 = new Person(2,"lu","DaWu"); List<Person> persons = new ArrayList<>(); persons.add(person1); persons.add(person2); String json = gson.toJson(persons); System.out.println(json); } //json to list<bean> @Test public void jsonToListBean(){ String json = "[{'id':'1','name':'zhang','address':'Hubei'},{'id':'2','name':'lu','address':'DaWu'}]"; List<Person> persons = gson.fromJson(json, new TypeToken<List<Person>>(){}.getType()); for(Person per : persons){ System.out.println(per); } } //list string to string @Test public void listStringToJson(){ List<String> list = new ArrayList<>(); list.add("zhanglu"); list.add("hubei"); list.add("Dawu"); String json = gson.toJson(list); System.out.println(json); } //json string to list<string> @Test public void jsonToListString(){ String json = "['zhanglu','hubei','Dawu']"; List<String> list = gson.fromJson(json, new TypeToken<List<String>>(){}.getType()); for(String str : list){ System.out.println(str); } } //Map<String,object> to json @Test public void mapToJson(){ Map<String, Person> map = new HashMap<>(); Person person = new Person(1, "zhanglu", "湖北大悟"); Person person2 = new Person(2, "Alone", "HuBeiDaWu"); map.put("person", person); map.put("person2", person2); String json = gson.toJson(map); System.out.println(json); } //json to Map<Stirng,Object> @Test public void jsonToMap(){ String json = "{'person':{'id':1,'name':'zhanglu','address':'湖北大悟'},'person2':{'id':2,'name':'Alone','address':'HuBeiDaWu'}}"; Map<String, Person> map = gson.fromJson(json, new TypeToken<Map<String,Person>>(){}.getType()); for(String str : map.keySet()){ System.out.println("key:"+str); System.out.println((Person)map.get(str)); } } //test refrences obj //如果双向引用, 会产生死循环, 方法1, 在需要被过滤的字段上加上修饰符transient, Cat的animail加上了 //方法1:排除transient字段 /*//方法2:排除Modifier为指定类型的字段Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.PROTECTED) // <---.create();*/ //方法3:使用@Expose注解,注意,没有被 @Expose 标注的字段会被排除,如下所示: @Test public void testReferences(){ Animail animail = new Animail(); animail.setName("Animial"); Cat cat = new Cat(); cat.setId(1); cat.setName("Cat1"); cat.setAnimail(animail); Cat cat2 = new Cat(); cat2.setId(2); cat2.setName("Cat2"); cat.setAnimail(animail); List<Cat> cats = new ArrayList<>(); cats.add(cat2); cats.add(cat); animail.setCatlist(cats); String json = gson.toJson(animail); System.out.println(json); } //方法4:使用ExclusionStrategy定制字段排除策略,这种方式最灵活,下面的例子把所有以下划线开头的字段全部都排除掉: @Test public void ExclusionStrategy(){ ClassInfo classInfo = new ClassInfo(); classInfo.setClassNo("C0001"); classInfo.setClassName("Java_1"); StudentInfo stu1 = new StudentInfo(); stu1.setStuId(1); stu1.setStuName(1); StudentInfo stu2 = new StudentInfo(); stu2.setStuId(1); stu2.setStuName(1); stu1.setClassInfo(classInfo); stu2.setClassInfo(classInfo); List<StudentInfo> stulist = new ArrayList<>(); stulist.add(stu2); stulist.add(stu1); classInfo.setStudentslist(stulist); ExclusionStrategy myExclusionStrategy = new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes fa) { return fa.getName().equals("classInfo"); } @Override public boolean shouldSkipClass(Class<?> clazz) { return false; } }; Gson gson = new GsonBuilder().setExclusionStrategies(myExclusionStrategy).create(); String json = gson.toJson(classInfo); System.out.println(json); } }
2.使用阿里的fastJson方式解析json,阿里官方介绍说这个比gson效率更高速度更快,使用fastJson的人也非常多,至少我有些同学公司里面在使用, 不乏游戏开发在使用,也有人说有Bug,具体我也没有对两者进行比较测试.
fastJson同样支持常用的数据类型解析,还提供了大文本解析和对时间类型的解析方式,同样也有android版本jar, 但是这个不是C#的FastJson, 首字母大小写是不一样的, 也不是同一个东西, 不可混为一谈.
官网文档::https://github.com/alibaba/fastjson/wiki/常见问题
笔者测试使用的版本是1.1.41,下载地址:http://repo1.maven.org/maven2/com/alibaba/fastjson/1.1.41/
fastJson其它版本官方下载地址:http://repo1.maven.org/maven2/com/alibaba/fastjson/
maven配置:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency>
测试用例(源码附件fastJson.zip,下载地址:http://pan.baidu.com/s/1pJE1xsZ):
public class FastJsonTest { // Java bean to json @Test public void JavaBeanToJson() { Person person = new Person(1, "zhanglu", "Hubei"); String json = JSON.toJSONString(person); System.out.println(json); } // Json to Javabean @Test public void JsonToJavaBean() { String json = "{'address':'Hubei','id':1,'name':'zhanglu'}"; Person person = JSON.parseObject(json, Person.class); System.out.println(person); } // List<JavaBean> to json @Test public void listJavaBeanToJson() { Person p1 = new Person(1, "zhanglu", "Hubei"); Person p2 = new Person(2, "wukang", "Hubei"); List<Person> personlist = new ArrayList<>(); personlist.add(p1); personlist.add(p2); String json = JSON.toJSONString(personlist); System.out.println(json); } // Json to List<JavaBean> @Test public void JsonToListBean() { String json = "[{'address':'Hubei','id':1,'name':'zhanglu'},{'address':'Hubei','id':2,'name':'wukang'}]"; List<Person> persons = JSON.parseArray(json, Person.class); for (Person person : persons) { System.out.println(person); } } // List<String> to json @Test public void listStringToJson() { List<String> list = new ArrayList<>(); list.add("zhanglu"); list.add("wukang"); String json = JSON.toJSONString(list); System.out.println(json); } // json to List<String> @Test public void JsonToListString() { String json = "['zhanglu','wukang']"; List<String> list = JSON.parseArray(json, String.class); for (String str : list) { System.out.println(str); } } // Map<String,Object> to json @Test public void MapToJson() { Map<String, Person> map = new HashMap<>(); map.put("person1", new Person(1, "zhanglu", "Hubei")); map.put("person2", new Person(2, "wukang", "Hubei")); String json = JSON.toJSONString(map); System.out.println(json); } // Json to Map<String,JavaBean> @Test public void JsonToMap() { String json = "{'person1':{'address':'Hubei','id':1,'name':'zhanglu'},'person2':{'address':'Hubei','id':2,'name':'wukang'}}"; Map<String, Person> map = JSON.parseObject(json, new TypeReference<Map<String, Person>>() { }); for (String key : map.keySet()) { System.out.println("key:" + key); System.out.println(map.get(key)); } } // Test references javaBean // Animail,Cat @Test public void TestReferences() { Animail animail = new Animail(); animail.setName("animial"); Cat cat = new Cat(); cat.setId(1); cat.setName("MiMi"); Cat cat2 = new Cat(); cat2.setId(1); cat2.setName("CiCi"); cat.setAnimail(animail); cat2.setAnimail(animail); List<Cat> catlist = new ArrayList<>(); catlist.add(cat2); catlist.add(cat); animail.setCatlist(catlist); String json = JSON.toJSONString(animail); System.out.println(json); } // Test references javaBean // Animail,Cat @Test public void TestReferences2() { Animail animail = new Animail(); animail.setName("animial"); Cat cat = new Cat(); cat.setId(1); cat.setName("MiMi"); Cat cat2 = new Cat(); cat2.setId(1); cat2.setName("CiCi"); cat.setAnimail(animail); cat2.setAnimail(animail); List<Cat> catlist = new ArrayList<>(); catlist.add(cat2); catlist.add(cat); animail.setCatlist(catlist); String json = JSON.toJSONString(animail,SerializerFeature.DisableCircularReferenceDetect); System.out.println(json); } // methods 01 transient // @JSONField(serialize=false) // Date to Json @Test public void DateToJson(){ StudentInfo studentInfo = new StudentInfo(); studentInfo.setBirthday(new Date()); studentInfo.setId(1); JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd"; String json = JSON.toJSONString(studentInfo,SerializerFeature.WriteDateUseDateFormat); System.out.println(json); } }
3.使用net.sf.json解析
官网下载地址:http://sourceforge.net/projects/json-lib/files/json-lib/
其他依赖包: commons-beanutils , commons-collections , commons-lang , commons-logging ,ezmorph , json-lib
测试代码(SimpleJson.zip(下载地址:http://pan.baidu.com/s/1xqWmM)):
/** * * @author zhanglu * @Desc net.sf.json 测试, commons-collections 4-4.0 不兼容 */ public class SimpleJsonTest { // JavaBean to Json @Test public void JavaBeanToJson() { PersonBean person = new PersonBean(1, "zhanglu", "Hubei"); JSONObject json = JSONObject.fromObject(person); System.out.println(json); } // Json to JavaBean @Test public void JsonToJavaBean() { String json = "{'id':1,'address':'Hubei','name':'zhanglu'}"; PersonBean person = (PersonBean) JSONObject.toBean(JSONObject.fromObject(json), PersonBean.class); System.out.println(person); // Console result:This is person, id = 1, name = zhanglu, address = // Hubei } // List<JavaBean> to Json @Test public void ListToJson() { List<PersonBean> personlist = new ArrayList<PersonBean>(); personlist.add(new PersonBean(1, "zhanglu", "Hubei")); personlist.add(new PersonBean(2, "maomao", "Hebei")); String jsonString = JSONArray.fromObject(personlist).toString(); System.out.println(jsonString); // Console // result:[{"id":1,"address":"Hubei","name":"zhanglu"},{"id":2,"address":"Hebei","name":"maomao"}] } // JsonString to List<JavaBean> @SuppressWarnings("unchecked") @Test public void JsonStringToList() { String jsonString = "[{'id':1,'address':'Hubei','name':'zhanglu'},{'id':2,'address':'Hebei','name':'maomao'}]"; JSONArray jsonArray = JSONArray.fromObject(jsonString); // List<PersonBean> list = JSONArray.toList(jsonArray, objectClass);过时 List<PersonBean> list = JSONArray.toList(jsonArray, new PersonBean(),new JsonConfig()); for (PersonBean person : list) { System.out.println(person); } } // Array to Json @Test public void ArrayToJson() { Object[] obj = new Object[] { new PersonBean(1, "zhanglu", "Hubei"),new PersonBean(2, "maomao", "Hebei") }; String jsonString = JSONArray.fromObject(obj).toString(); System.out.println(jsonString); } // Json to Array @Test public void JsonToArray() { String jsonString = "[{'id':1,'address':'Hubei','name':'zhanglu'},{'id':2,'address':'Hebei','name':'maomao'}]"; JSONArray jsonArray = JSONArray.fromObject(jsonString); Object[] obj = (Object[]) JSONArray.toArray(jsonArray, PersonBean.class); for (int i = 0; i < obj.length; i++) { System.out.println((PersonBean) obj[i]); } } // Map to Json @Test public void MapToJson() { Map<String, PersonBean> map = new HashMap<String, PersonBean>(); map.put("person1", new PersonBean(1, "zhanglu", "Hubei")); map.put("person2", new PersonBean(2, "maomao", "Hebei")); String json = JSONObject.fromObject(map).toString(); System.out.println(json); } // Json to map @Test public void JsonToMap() { String jsonStr = "{'person1':{'id':1,'address':'Hubei','name':'zhanglu'},'person2':{'id':2,'address':'Hebei','name':'maomao'}}"; JSONObject jsonObject = JSONObject.fromObject(jsonStr); Map<String,PersonBean> map = new HashMap<String,PersonBean>(); for (Iterator<?> iter = jsonObject.keys(); iter.hasNext();) { String key = (String) iter.next(); map.put(key,(PersonBean)JSONObject.toBean((JSONObject) jsonObject.get(key),PersonBean.class)); } for(String key : map.keySet()){ System.out.println((PersonBean)map.get(key)); } } //Reference, ClassInfoBean ===> StudentBean or ClassInfoBean <=== StudentBean @Test public void ReferenceToJson(){ ClassInfoBean classInfo1 = new ClassInfoBean(1,"Java_1"); ClassInfoBean classInfo2 = new ClassInfoBean(2,"Java_2"); StudentInfo student1 = new StudentInfo(1, "zhanglu", classInfo1); StudentInfo student2 = new StudentInfo(2, "wukang", classInfo1); StudentInfo student3 = new StudentInfo(3, "maomao", classInfo2); List<StudentInfo> stulist = new ArrayList<StudentInfo>(); stulist.add(student1); stulist.add(student2); stulist.add(student3); String jsonString = JSONArray.fromObject(stulist).toString(); System.out.println(jsonString); //Console result: //[{"id":1,"classInfo":{"classId":1,"className":"Java_1"},"stuName":"zhanglu"}, // {"id":2,"classInfo":{"classId":1,"className":"Java_1"},"stuName":"wukang"}, // {"id":3,"classInfo":{"classId":2,"className":"Java_2"},"stuName":"maomao"}] } //references to bean @SuppressWarnings("unchecked") @Test public void RefrenceToBean(){ String json = "[{'id':1,'classInfo':{'classId':1,'className':'Java_1'},'stuName':'zhanglu'},{'id':2,'classInfo':{'classId':1,'className':'Java_1'},'stuName':'wukang'},{'id':3,'classInfo':{'classId':2,'className':'Java_2'},'stuName':'maomao'}]"; JSONArray jsonArray = JSONArray.fromObject(json); List<StudentInfo> list = JSONArray.toList(jsonArray, new StudentInfo(),new JsonConfig()); for (StudentInfo stu : list) { System.out.println(stu); } //Console result: //This is a student , id = 1, name = zhanglu,ClassInfo: className = Java_1 //This is a student , id = 2, name = wukang,ClassInfo: className = Java_1 //This is a student , id = 3, name = maomao,ClassInfo: className = Java_2 } //Error Reference Animail <==> Cat @Test public void ErrorReferemce(){ Animail animail = new Animail(); animail.setId(1); animail.setName("猫"); List<Cat> catlist = new ArrayList<Cat>(); catlist.add(new Cat(1, "MiMi", animail)); catlist.add(new Cat(2, "喵喵", animail)); catlist.add(new Cat(3, "CiCi", animail)); animail.setCatlist(catlist);//双向 String json = JSONArray.fromObject(animail).toString(); System.out.println(json); //net.sf.json.JSONException: There is a cycle in the hierarchy! //双向引用会出现死循环. 如果没有异常, 这也是一个错误的结果, 导致json数据庞大 , 可能会出现内存溢出 } //References filter JsonConfig @Test public void ReferencesFiterJsonConfig(){ JsonConfig config = new JsonConfig(); config.setJsonPropertyFilter(new PropertyFilter() { @Override public boolean apply(Object source, String name, Object value) { return name.equals("catlist");//设置过滤catlist集合 } }); Animail animail = new Animail(); animail.setId(1); animail.setName("猫"); List<Cat> catlist = new ArrayList<Cat>(); catlist.add(new Cat(1, "MiMi", animail)); catlist.add(new Cat(2, "喵喵", animail)); catlist.add(new Cat(3, "CiCi", animail)); animail.setCatlist(catlist);//双向 String json = JSONArray.fromObject(animail,config).toString();//引用配置对象 System.out.println(json); //Console result:[{"id":1,"name":"猫"}] } //References filter @Test public void setFilterProperty(){ Animail animail = new Animail(); animail.setId(1); animail.setName("猫"); List<Cat> catlist = new ArrayList<Cat>(); catlist.add(new Cat(1, "MiMi", animail)); catlist.add(new Cat(2, "喵喵", animail)); catlist.add(new Cat(3, "CiCi", animail)); animail.setCatlist(catlist);//双向 JsonConfig config = new JsonConfig(); config.setExcludes(new String[]{"catlist"}); String json = JSONArray.fromObject(animail,config).toString();//引用配置对象 System.out.println(json); //Console result:[{"id":1,"name":"猫"}] } }
另外给大家推荐一个Jar包下载网址:http://www.java2s.com/Code/Jar/e/Cataloge.htm