记录一下吧,确实学到了很多。
以前对json没有概念,今天老师给了我一道题,题目是这样的:
写一个工具类,有两个方法,一个是输入类对象,输出类对象的json字符串,还有一个是输入json字符串和对象类型,输出类对象。
既然跟json有关,我开始百度了解json字符串:
百度是这样说的:JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
我看了看这种数据,发现和我以前使用过的ini配置文件格式有一点一样,都是一个属性,然后跟数据。下一步我开始研究题目,我把这里的输入类对象理解为json对象,结果老师告诉我是任意类,乍一看确实有点懵,老师说这里的类以是person类,car类,或者集合类,说实话,一看到集合类就懵了,因为我还没有学习集合类。
那老师就说,先来个简单的,就person类就行,慢慢来从,从简单开始,但是最终要我的写的这个类可以存放任意数据,然后都能转换为json字符串,于是噩梦开始了…
我开始疯狂恶补,通过百度得知阿里爸爸的fastjson用的多,已经写好了,于是我开始下载fastjson包.
这里附上fastjson包的下载地址:fastjson.jar下面是详细步骤,望你们能够少走冤枉路。如果懒得找,也可以资助我的下载,嘻嘻,你懂的。
当我辛辛苦苦下载好了fastjson,我就开始百度如何在eclispe导入包,百度也是各种各样,当我成功导入包,百度又告诉我需要在pom.xml文件下面加入依赖,你说对了,然后我又开始找这个文件,但是没找到,继续百度,说这是在maven管理器下需要做的事情,如果不是maven则不需要加入依赖,于是我回归正常,准备加入包,开始写代码,improt com.alibaba.fastjson.*;,等等??为什么是红色的???
还有次是提示The package com.alibaba.fastjson is not accessible,翻译过来就是这个类不可访问,于是我又踏上百度,又开始重新建项目,重新导入包,突然发现可以用,回想一下,可能百度方法不一,用错了,而且解决问题也不像百度上面那么复杂,只需要添加包的时候选择添加外部包,而不是内部包,这个问题即可解决:
说实话,我也不清楚我说的对不对,但庆幸的这个包终于可以用了,哒哒哒哒敲了一个普通的类,有姓名,年龄,性别这些属性,然后开始写测试类来测试能不能将这个我自定义的类转为json字符串,代码都写好了:
//自定义类
public class person {
private String name;
private int age;
private String sex;
public person(String name,int age,String sex) {
this.name=name;
this.age=age;
this.sex=sex;
}
public String getName() {
return name;
}
public String setName() {
return this.name=name;
}
public int getAge() {
return age;
}
public int setAge() {
return this.age=age;
}
public String getSex() {
return sex;
}
public String setSex() {
return this.sex=sex;
}
}
//测试类
import com.alibaba.fastjson.*;
public class test {
public static void main(String[] args) {
person pe=new person("张旭",21,"男");
Object obj =JSON.toJSONString(pe);
String peison =JSON.toJSONString(obj);
System.out.println(peison);
}
}
没有什么错误提示,嗯好了点击编译,你猜的没错,又出来了异常。
提示java.lang.NoClassDefFoundError异常,于是,,,我又踏上百度之旅,我找到了一篇关于JAVA Json运行期间出现java.lang.NoClassDefFoundError问题的文章,通过阅读,我得知是我fastjson版本的问题,于是我看了看我下载的fastjson版本为1.2.49,那我就想,文章里面用了低版本那我也下载一个低版本试一试,
我下载了1.2.2和1.2.62版本,对,不出意外,还是提示异常,我又开始查看自己的jdk版本,发现是最新的10,于是反过来想一想,我解决不了fastjson版本问题,我的jdk又是最新的,那么我降低我jdk试一试!!
就是这里我把10改为1.4
对,没错 你猜错了,它可以运行了:
运行结果:
但是当我写下这篇文章的时候,为了列出异常图片,我再次将1.4改为10,我发现异常已经不出来了,我也不知道为什么,如果有那位大佬知道,可以评论告诉我,自此,一个自定义类转json字符串已经完结。
继续往下看,(这里已经是第二天了,我看了看集合类,恶补了一些东西)回到老师口中的map list集合类中,
这是map转json,接着上面的自定义类
Map<String ,person> map =new HashMap<String,person>();
map.put("第一名",new person("张旭",21,"男"));
String mapjson=JSON.toJSONString(map);
System.out.println(mapjson);
List<person> list =new ArrayList<person>();
list.add(new person("张旭",21,"男"));
String mapjson2=JSON.toJSONString(list);
System.out.println(mapjson2);
运行结果:
接着我们回到文章最初的那道题目:
一个工具类。
第一个功能是输入任意类对象,然后输出json字符串。
第二个功能是输入json字符串和要转换成的类对象类型,然后输出该类对象。
想一下,什么叫任意类?记不记得书中曾写到两种:
java所有类都继承于Object类,你也可以打开java文档手动查看
到该继承关系:
所以可以使用Object类,或者使用泛型,我这里选择泛型
//工具类
public class instrument {
//第一个方法,输入任意类对象,然后输出json字符串。所以方法的参数自然是OBject类型
public static String setJSON(Object obj) {
String str =JSON.toJSONString(obj);
return str;
}
//第二个方法,输入json字符串和要转换成的类对象类型,然后输出该类对象。所以参数应该是String和泛型
public static <T> T getJSON(String json,Class<T> obj) {
T t=JSONArray.parseObject(json,obj);
return t;
}
}
对你没有看错,就是怎么简单,因为它是最后的结论,但是得出结论期间,我简直是错了有错。
下面来测试一下这个到底管不管用:
先用自定义类来测试,还是上面的person类:
person pe=new person("张旭",21,"男");
String str =instrument.setJSON(pe);//person类对象转json字符串
System.out.println(str);
person p =instrument.getJSON(str, person.class);//json字符串转person类对象
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getSex());
Map<String ,person> map =new HashMap<String,person>();
map.put("1",new person("张旭",21,"男"));
String str =instrument.setJSON(map);
System.out.println(str);
Map<String ,Object> mapjson =new HashMap<String,Object>();
mapjson=instrument.getJSON(str,Map.class);
person p =instrument.getJSON(mapjson.get("1").toString(), person.class);
System.out.println(mapjson);
System.out.println(mapjson.get("1"));
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getSex());
可以看到,能获得map中的值,但是这里的值是一个person类对象,没关系,还是这个方法,我们还能获取person类对象的属性。
这里可能有些人会出错,要注意的是两次的map类对象 创建不一样,如果第二次将Object改为person后会出现下面错误
我也是在这里耗了很多时间,还是那句话,希望看完这篇文章可以让你少走弯路。
接下来来测试List类:
List<person> arrlist =new ArrayList<>();
arrlist.add(new person("张旭",21,"男"));
String str =instrument.setJSON(arrlist);//list类转为json字符串
System.out.println(str);
List<Object> mapjson =new ArrayList<>();
mapjson=instrument.getJSON(str,List.class);//json字符串转list
person p =instrument.getJSON(mapjson.get(0).toString(), person.class);//继续转为person类
System.out.println(mapjson);
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getSex());