0


将json字符串与实体类互相转换

文章目录

01.概述

如果我们接收到的是一个json字符串,我们该如何对该字符串进行解析?

  • 方式一:使用实体类进行解析
  • 方式二:使用map进行解析

使用的依赖jar包:

fastjson
compile('com.alibaba:fastjson:1.2.xx')

02.对json字符串进行解析

使用实体类进行解析

创建一个用于接收的实体类:使用json字符串中的那些字段,实体类的属性值一定要和JSON串中的

key

对应

假设JSON字符串如下:

"{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"sex\":\"man\",\"age\":18}"

对应的实体类属性就应该定义成如下的样子:

publicclassPersonInfoDto{privateDate bornTime;privateString userName;privateString sex;privateInteger age;publicDategetBornTime(){return bornTime;}publicvoidsetBornTime(Date bornTime){this.bornTime = bornTime;}publicStringgetUserName(){return userName;}publicvoidsetUserName(String userName){this.userName = userName;}publicStringgetSex(){return sex;}publicvoidsetSex(String sex){this.sex = sex;}publicIntegergetAge(){return age;}publicvoidsetAge(Integer age){this.age = age;}@OverridepublicStringtoString(){return"PersonInfoDto{"+"bornTime="+ bornTime +", userName='"+ userName +'\''+", sex='"+ sex +'\''+", age="+ age +'}';}}

代码示例:

publicclass test01 {publicstaticvoidmain(String[] args){String jsonStr ="{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"sex\":\"man\",\"age\":18}";PersonInfoDto personInfoDto =JSONObject.parseObject(jsonStr,PersonInfoDto.class);System.out.println(personInfoDto.toString());}}

运行结果:

PersonInfoDto{bornTime=FriSep3019:48:59CST2022, userName='AISMALL', sex='man', age=18}

使用实体类解析拓展

publicclass test01 {publicstaticvoidmain(String[] args){// json串里面的key与实体类字段匹配几个就会赋值几个,匹配不上的赋值为nullString jsonStr1 ="{\"bornTime\":\"2022-09-30 19:48:59\"}";PersonInfoDto personInfoDto1 =JSONObject.parseObject(jsonStr1,PersonInfoDto.class);System.out.println("personInfoDto1: "+ personInfoDto1);// json串中出现重复的字段,就会使用后者进行覆盖String jsonStr2 ="{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"userName\":\"AISMALL2\"}";PersonInfoDto personInfoDto2 =JSONObject.parseObject(jsonStr2,PersonInfoDto.class);System.out.println("personInfoDto2: "+ personInfoDto2);// json串里面的key与实体类字段匹配几个就会赋值几个,不管该传有多长,只取匹配到的key的value给实体类赋值String jsonStr3 ="{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"sex\":\"man\",\"age\":18,\"age2\":18}";PersonInfoDto personInfoDto3 =JSONObject.parseObject(jsonStr3,PersonInfoDto.class);System.out.println("personInfoDto3: "+ personInfoDto3);// 刚好对应的情况String jsonStr4="{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"sex\":\"man\",\"age\":18}";PersonInfoDto personInfoDto4 =JSONObject.parseObject(jsonStr4,PersonInfoDto.class);System.out.println("personInfoDto4: "+ personInfoDto4);}}

运行结果:

personInfoDto1:PersonInfoDto{bornTime=FriSep3019:48:59CST2022, userName='null', sex='null', age=null}
personInfoDto2:PersonInfoDto{bornTime=FriSep3019:48:59CST2022, userName='AISMALL2', sex='null', age=null}
personInfoDto3:PersonInfoDto{bornTime=FriSep3019:48:59CST2022, userName='AISMALL', sex='man', age=18}
personInfoDto4:PersonInfoDto{bornTime=FriSep3019:48:59CST2022, userName='AISMALL', sex='man', age=18}

小结

  • json串里面的key与实体类字段匹配几个就会赋值几个,不管该传有多长,只取匹配到的key的value给实体类赋值,匹配不上的赋值为null。
  • json串中出现重复的字段,就会使用后者进行覆盖。

使用map进行解析

publicclass test01 {publicstaticvoidmain(String[] args){// json字符串String jsonStr ="{\"age\":18,\"sex\":\"man1\",\"userName\":\"AISMALL1\"}";//====================方式一==============================Map maps =(Map)JSON.parse(jsonStr);for(Object map : maps.entrySet()){System.out.println(((Map.Entry)map).getKey()+": "+((Map.Entry)map).getValue());}//====================方式二==============================Map mapTypes =JSON.parseObject(jsonStr);for(Object obj :mapTypes.keySet()){System.out.println("key: "+ obj +"  value: "+ mapTypes.get(obj));}//====================方式三==============================Map mapType =JSON.parseObject(jsonStr,Map.class);System.out.println("这个是用JSON类,指定解析类型,来解析JSON字符串!!!");for(Object obj :mapType.keySet()){System.out.println("key: "+ obj +"  value: "+ mapType.get(obj));}//====================方式四==============================Map json =(Map)JSONObject.parse(jsonStr);//用Json对象解析成Map类型for(Object map : json.entrySet()){System.out.println(((Map.Entry)map).getKey()+": "+((Map.Entry)map).getValue());}//====================方式五==============================JSONObject jsonobject =JSONObject.parseObject(jsonStr);for(Object map:jsonobject.entrySet()){System.out.println(((Map.Entry)map).getKey()+": "+((Map.Entry)map).getValue());}}}

03.Map和json字符串的互相转换

3.1.json字符串转换为Map

参考:使用map进行解析

3.2.Map转换为json字符串

publicclass test01 {publicstaticvoidmain(String[] args){// 创建一个HashmapMap<String,Object> paraMap =newHashMap();
        paraMap.put("userName","AISMALL");
        paraMap.put("sex","man");
        paraMap.put("age",18);// 方式一:转换为json字符串String jsonStr =JSONObject.toJSONString(paraMap);System.out.println("jsonStr: "+ jsonStr);// 方式二:转换为json字符串String jsonStr2 =Json.toJson(paraMap);System.out.println("jsonStr2: "+ jsonStr2);}}

运行结果:

jsonStr:{"sex":"man","userName":"AISMALL","age":18}
jsonStr2:{"sex":"man","userName":"AISMALL","age":18}

04.json操作的一些小技巧

4.1.json字符转换为实体类

前面已经介绍了:

JSONObject.parseObject(jsonString,PersonInfoDto.class);

4.2.实体类转json字符串

publicclass test01 {publicstaticvoidmain(String[] args){Date date =newDate();// 创建一个Date对象,获取当前时间SimpleDateFormat f =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 指定格式化格式
        f.format(date);// 将当前时间袼式化为指定的格式PersonInfoDto personInfoDto =newPersonInfoDto();
        personInfoDto.setBornTime(date);
        personInfoDto.setUserName("AISMALL");
        personInfoDto.setSex("man");
        personInfoDto.setAge(18);String jsonStr =JSON.toJSONString(personInfoDto);System.out.println(jsonStr);}}

运行结果:

{"age":18,"bornTime":1665113383685,"sex":"man","userName":"AISMALL"}

4.3.json字符串转换为json对象

publicclass test01 {publicstaticvoidmain(String[] args){// json字符串String jsonStr ="{\"test\":\"test\",\"Result\":[{\"Result1\":\"Result1\",\"Detail1\":\"Detail1\"},{\"Result2\":\"Result2\",\"Detail2\":\"Detail2\"},{\"Result3\":\"Result3\",\"Detail3\":\"Detail3\"}]}";// json字符串转换为jsonObjectJSONObject jSONObject =JSONObject.parseObject(jsonStr);System.out.println(jSONObject);// 根据Key取出Json对象中的值String testStr = jSONObject.getString("test");System.out.println("testStr: "+ testStr);}}

运行结果:

{"test":"test","Result":[{"Detail1":"Detail1","Result1":"Result1"},{"Detail2":"Detail2","Result2":"Result2"},{"Detail3":"Detail3","Result3":"Result3"}]}
testStr: test

注意:

  • Json对象和Json字符串的区别在于,Json对象(JSONObject)里面有很多定义好的方法可以帮助我们根据Key取出Json对象中的值,后面我们也会演示几个JSONObject提供的方法。

4.4.json对象转换为json字符串

publicclass test01 {publicstaticvoidmain(String[] args){// json字符串String jsonStr ="{\"test\":\"test\",\"Result\":[{\"Detail1\":\"Detail1\",\"Result1\":\"Result1\"},{\"Detail2\":\"Detail2\",\"Result2\":\"Result2\"},{\"Detail3\":\"Detail3\",\"Result3\":\"Result3\"}]}";// json字符串转换为jsonObjectJSONObject jSONObject =JSONObject.parseObject(jsonStr);// json对象转换为json字符串String jsonObjectConv =JSON.toJSONString(jSONObject);System.out.println(jsonObjectConv);}}

运行结果:

{"test":"test","Result":[{"Detail1":"Detail1","Result1":"Result1"},{"Detail2":"Detail2","Result2":"Result2"},{"Detail3":"Detail3","Result3":"Result3"}]}

4.5.json字符串数组转换json数组

注意:json字符串数组,即String是JSONArray格式的字符串

publicclass test01 {publicstaticvoidmain(String[] args){// json字符串数组String jsonArr ="[{\"Detail1\":\"Detail1\",\"Result1\":\"Result1\"},{\"Detail2\":\"Detail2\",\"Result2\":\"Result2\"},{\"Detail3\":\"Detail3\",\"Result3\":\"Result3\"}]";JSONArray jsonArray=JSONArray.parseArray(jsonArr);// 转换成Json字符串数组之后,就可以遍历了,字符串是无法遍历的for(Object jsonStr:jsonArray){System.out.println(jsonStr);}}}

运行结果:

{"Detail1":"Detail1","Result1":"Result1"}{"Detail2":"Detail2","Result2":"Result2"}{"Detail3":"Detail3","Result3":"Result3"}

4.6.List<实体类>转json数组

publicclass test01 {publicstaticvoidmain(String[] args){PersonInfoDto personInfoDto1 =newPersonInfoDto();
        personInfoDto1.setUserName("AISMALL1");
        personInfoDto1.setSex("man1");
        personInfoDto1.setAge(18);PersonInfoDto personInfoDto2 =newPersonInfoDto();
        personInfoDto2.setUserName("AISMALL2");
        personInfoDto2.setSex("man2");
        personInfoDto2.setAge(19);List<PersonInfoDto> list =newArrayList<>();
        list.add(personInfoDto1);
        list.add(personInfoDto2);// 转换为json字符串String jsonStr =JSONObject.toJSONString(list);System.out.println("jsonStr: "+ jsonStr);// json字符串转换为json数组JSONArray jsonArray=JSONArray.parseArray(jsonStr);// 转换成Json字符串数组之后,就可以遍历了,字符串是无法遍历的for(Object jsonStr1:jsonArray){System.out.println(jsonStr1);}}}

运行结果:

jsonStr:[{"age":18,"sex":"man1","userName":"AISMALL1"},{"age":19,"sex":"man2","userName":"AISMALL2"}]{"sex":"man1","userName":"AISMALL1","age":18}{"sex":"man2","userName":"AISMALL2","age":19}

4.7.json数组转List<实体类>

publicclass test01 {publicstaticvoidmain(String[] args){// json字符串数组String jsonStr ="[{\"age\":18,\"sex\":\"man1\",\"userName\":\"AISMALL1\"},{\"age\":19,\"sex\":\"man2\",\"userName\":\"AISMALL2\"}]";System.out.println("jsonStr: "+ jsonStr);// json字符串转换为json数组JSONArray jsonArray=JSONArray.parseArray(jsonStr);List<PersonInfoDto> personInfoDtoList = jsonArray.toJavaList(PersonInfoDto.class);for(PersonInfoDto personInfoDto:personInfoDtoList){System.out.println("personInfoDto: "+ personInfoDto);}}}

运行结果:

jsonStr:[{"age":18,"sex":"man1","userName":"AISMALL1"},{"age":19,"sex":"man2","userName":"AISMALL2"}]
personInfoDto:PersonInfoDto{bornTime=null, userName='AISMALL1', sex='man1', age=18}
personInfoDto:PersonInfoDto{bornTime=null, userName='AISMALL2', sex='man2', age=19}

05.josnObject操作的一些小技巧

JSONObject如下:

{"test":"test","Result":[{"Result1":"Result1","Detail1":"Detail1"},{"Result2":"Result2","Detail2":"Detail2"},{"Result3":"Result3","Detail3":"Detail3"}]}

5.1.JSONObject中的数组提取为JSONArray

publicclass test01 {publicstaticvoidmain(String[] args){// json字符串String jsonStr ="{\"test\":\"test\",\"Result\":[{\"Result1\":\"Result1\",\"Detail1\":\"Detail1\"},{\"Result2\":\"Result2\",\"Detail2\":\"Detail2\"},{\"Result3\":\"Result3\",\"Detail3\":\"Detail3\"}]}";// json字符串转换为jsonObjectJSONObject jSONObject =JSONObject.parseObject(jsonStr);// 获取里面的Json字符串数组JSONArray jsonArray = jSONObject.getJSONArray("Result");// 转换成Json字符串数组之后,就可以遍历了,字符串是无法遍历的for(Object jsonStr2:jsonArray){System.out.println(jsonStr2);}}}

运行结果

[{"Detail1":"Detail1","Result1":"Result1"},{"Detail2":"Detail2","Result2":"Result2"},{"Detail3":"Detail3","Result3":"Result3"}]

5.2.JSONObject获取value

publicclass test01 {publicstaticvoidmain(String[] args){// json字符串String jsonStr ="{\"test\":\"test\",\"Result\":[{\"Result1\":\"Result1\",\"Detail1\":\"Detail1\"},{\"Result2\":\"Result2\",\"Detail2\":\"Detail2\"},{\"Result3\":\"Result3\",\"Detail3\":\"Detail3\"}]}";// json字符串转换为jsonObjectJSONObject jSONObject =JSONObject.parseObject(jsonStr);// 返回值为String类型String testStr = jSONObject.getString("test");System.out.println("testStr: "+ testStr);// 返回值为Object类型Object testObject = jSONObject.get("Result");System.out.println("testObject: "+ testObject);}}

运行结果:

testStr: test
testObject:[{"Detail1":"Detail1","Result1":"Result1"},{"Detail2":"Detail2","Result2":"Result2"},{"Detail3":"Detail3","Result3":"Result3"}]

06.总结

更多方法可以去查看

JSONArray

JSONObject

的源码。

标签: json java 前端

本文转载自: https://blog.csdn.net/weixin_45583303/article/details/127192075
版权归原作者 彤彤的小跟班 所有, 如有侵权,请联系我们删除。

“将json字符串与实体类互相转换”的评论:

还没有评论