java自定义类对象转json字符串(记录我是如何从一无所知到最后的了解)

在这里插入图片描述

记录一下吧,确实学到了很多。
以前对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类

 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对象:

  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());

在这里插入图片描述

发布了60 篇原创文章 · 获赞 107 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Fdog_/article/details/104560839