当前位置: 首页 > 后端技术 > Java

FastJson,Jackson处理Json转换对象,复杂对象问题

时间:2023-04-01 20:47:20 Java

FastJson,Jackson处理Json转换对象,复杂对象问题开发过程中最常见的问题就是Json格式转换问题。包括Json转object、data、map等。FastJson,一个处理json的通用类库,Jackson本人为他们做了一些总结,如有不足请留言。希望能对大家有所帮助。FastJson准备了两个套娃类@Data@AllArgsConstructor@NoArgsConstructorpublicclassFastJsonPerson{privateStringname;私有整数agexx;私有字符串其他;privateList卡;}@Data@NoArgsConstructor@AllArgsConstructorpublicclassCard{privateStringcardName;私人日期卡时间;}1。对象到字符串@TestpublicvoidtransformString(){FastJsonPerson;person=newFastJsonPerson();person.setName("士兵指挥官");person.setAgexx(18);person.setOther("其他人被屏蔽了");person.setCards(Arrays.asList(newCard("招商局",newDate()),newCard("上海发展",newDate())));字符串personString=JSON.toJSONString(person);System.out.println(personString);}//结果:{"agexx":18,"cards":[{"cardName":"Investment","cardTime":1631188795258},{"cardName":"Pufa","cardTime":1631188795258}],"name":"SoldierCommander","other":"Otherstobeblocked"}如果在转换过程中不需要某个字段,可以加上@JSONField(serialize=false),注意不是@jsonIgnore,那是杰克逊。在转换的过程中,我还想把字段别名@JSONField(name="xxx")改成日期格式@JSONField(format="yyyy-MM-ddHH:mm:ss")然后改对应的实体类完成以上三个请求。@Data@AllArgsConstructor@NoArgsConstructorpublicclassFastJsonPerson{私有字符串名称;@JSONField(name="age")privateIntegeragexx;@JSONField(serialize=false)privateStringother;privateListcards;}@Data@NoArgsConstructor@AllArgsConstructorpublicclassCard{privateStringcardName;}@JSONField(format="yyyy-MM-ddHH:mm:ss")privateDatecardTime;}再次执行上面的测试方法,会发现结果变成;agexx--->age,时间格式变成正常,其他字段被忽略。{"age":18,"cards":[{"cardName":"招商局","cardTime":"2021-09-0920:12:26"},{"cardName":"上海浦东发展","cardTime":"2021-09-0920:12:26"}],"name":"士兵指挥官"}2.字符串转对象,集合对象;@TestpublicvoidstringToObject(){//对于简单的String,我们可以将其转化为Array,然后通过名称获取内容。Strings="{\"age\":18,\"cards\":[{\"cardName\":\"Investment\",\"cardTime\":\"2021-09-0920:12:26\"},{\"cardName\":\"Pufa\",\"cardTime\":\"2021-09-0920:12:26\"}],\"name\":\"Bing长的\”}”;JSONObject对象=JSON.parseObject(s);System.out.println(object.get("年龄"));System.out.println(object.get("姓名"));系统。out.println(object.get("卡片"));Stringlist="[{\"age\":18,\"cards\":[{\"cardName\":\"Investment\",\"cardTime\":\"2021-09-0920:12:26\"},{\"cardName\":\"Pufa\",\"cardTime\":\"2021-09-0920:12:26\"}],\"name\":\"士兵指挥官\"},{\"age\":18,\"cards\":[{\"cardName\":\"Investment\",\"cardTime\":\"2021-09-0920:12:26\"},{\"cardName\":\"Pufa\",\"cardTime\":\"2021-09-0920:12:26\"}],\"name\":\“士兵\”}]”;ListpersonList=JSON.parseArray(list,FastJsonPerson.class);System.out.println(personList);}3.StringtoMap@TestpublicvoidstringToMap(){Strings="{\"age\":18,\"cards\":[{\"cardName\":\"Investment\",\"cardTime\":\"2021-09-0920:12:26\"},{\"cardName\":\"上海开发区\",\"cardTime\":\"2021-09-0920:12:26\"}],\"name\":\"SoldierCommander\"}";Mapmap=(Map)JSON.parseObject(s);System.out.println(map);}Jackson准备两个套娃类@Data@NoArgsConstructor@AllArgsConstructorpublicclassJacksonCard{privateStringcardName;privateDatecardTime;}@Data@NoArgsConstructor@AllArgsConstructorpublicclassJacksonPerson{privateStringname;privateIntegeragexx;privateprivateStringateotherList;卡片;}1.对象到字符串@SneakyThrows@TestpublicvoidtransformToString(){JacksonPersonperson=newJacksonPerson();person.setName("SoldierCommander");person.setAgexx(18);person.setOther("其他要屏蔽");person.setCards(Arrays.asList(newJacksonCard("招商局",newDate()),newJacksonCard("上海发展",newDate())));ObjectMapperobjectMapper=newObjectMapper();System.out.println(objectMapper.writeValueAsString(person));}//Result:{"name":"SoldierCommander","agexx":18,"other":"其他要屏蔽","cards":[{"cardName":"Investment","cardTime":1631242139184},{"cardName":"上海浦东发展","cardTime":1631242139184}]}如果在转换过程中不需要某个字段,可以添加@JsonIgnore,想要转换过程中改变字段别名@JsonProperty("age")Formatdate@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")根据对应的实体类进行转换对上面的描述@Data@NoArgsConstructor@AllArgsConstructorpublicclassJacksonPerson{privateStringname;@JsonProperty("age")私有整数agexx;@JsonIgnore私有字符串其他;私有列表卡;}@Data@NoArgsConstructor@AllArgsConstructorpublicclassJacksonCard{privateStringcardName;"yyyy-MM-ddHH:mm:ss",timezone="GMT+8")privateDatecardTime;}2.字符串转对象,对象集合,复杂对象@TestpublicvoidtransformToObject()throwsIOException{Strings="{\"age\":18,\"cards\":[{\"cardName\":\"Investment\",\"cardTime\":\"2021-09-0920:12:26\"},{\"cardName\":\"上海开发区\",\"cardTime\":\"2021-09-0920:12:26\"}],\"name\":\"SoldierCommander\"}";Stringlist="[{\"age\":18,\"cards\":[{\"cardName\":\"Investment\",\"cardTime\":\"2021-09-0920:12:26\"},{\"cardName\":\"Pufa\",\"cardTime\":\"2021-09-0920:12:26\"}],\"name\":\"SoldierCommander\"},{\"age\":18,\"cards\":[{\"cardName\":\"Investment\",\"cardTime\":\"2021-09-0920:12:26\"},{\"cardName\":\"上海开发区\",\"cardTime\":\"2021-09-0920:12:26\"}],\"name\":\"Soldier\"}]";ObjectMapperobjectMapper=newObjectMapper();System.out.println(objectMapper.readValue(s,JacksonPerson.class));ListpersonList=(List)objectMapper.readValue(list,objectMapper.getTypeFactory().constructParametricType(List.class,JacksonPerson.class));System.out.println(personList);//如果多-层Matryoshka,你可以使用TypeReference,你想要的一切都是List>personList1=objectMapper.readValue(list,newTypeReference>>(){});System.out.println(personList1);}下面是JsonUtils工具类包com.cn.zj.json;导入com.fasterxml.jackson.annotation.JsonInclude;导入com.fasterxml.jackson.core.type.TypeReference;导入com.fasterxml.jackson.databind.DeserializationFeature;导入com.fasterxml.jackson.databind.ObjectMapper;导入com.fasterxml.jackson.databind.SerializationFeature;导入lombok.extern.slf4j.Slf4j;导入org.springframework.util.StringUtils;导入java.text.SimpleDateFormat;/***@description:*@作者:wangdakai*@date:2021/9/10*/@Slf4jpublicclassJsonUtils{privatestaticObjectMapperobjectMapper=newObjectMapper();static{//序列化时序列对象的所有属性objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);//反序列化时如果其他属性比较多,不抛异常objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);//如果是空对象,不抛异常,false);//取消时间的转换格式,默认为timestamp,可以取消,需要同时设置要显示的时间格式objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);objectMapper.setDateFormat(newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"));}/***对象转Json*@paramobj*@param*@return*/publicstaticStringobjectToJson(Tobj){if(obj==null){returnnull;}尝试{返回objinstanceof字符串?(字符串)obj:objectMapper.writeValueAsString(obj);}catch(Exceptione){log.warn("ParseObjecttoJsonerror",e);e.printStackTrace();返回空值;}}/***json转换对象*@paramsrc*@paramclazz*@param*@return*/publicstaticTjsonToObject(Stringsrc,Classclazz){if(StringUtils.isEmpty(src)||clazz==null){返回null;}尝试{返回clazz.equals(String.class)?(T)源:对象映射per.readValue(src,clazz);}catch(Exceptione){log.warn("ParseJsontoObjecterror",e);e.printStackTrace();返回空值;}}/***json传输想要的对象;处理各种复杂格式的对象非常通用*@paramsrc*@paramtypeReference*@param*@return*/publicstaticTjsonToObject(Stringsrc,TypeReferencetypeReference){if(StringUtils.isEmpty(src)||typeReference==空){返回空;}try{return(T)(typeReference.getType().equals(String.class)?src:objectMapper.readValue(src,typeReference));}catch(Exceptione){log.warn("ParseJsontoObjecterror",e);e.printStackTrace();返回空值;}}/***json转换对象*@paramstr*@paramcollectionClass*@paramelementClasses*@param*@return*/publicstaticTjsonToTransfer(Stringstr,ClasscollectionClass,Class...elementClasses){try{return(T)objectMapper.readValue(str,objectMapper.getTypeFactory().constructParametricType(collectionClass,元素类));}catch(Exceptione){log.warn("ParseJsontoObjecterror",e);e.printStackTrace();}返回空值;https://hutool.cn/docs/#/json...情绪激动的可以去看看。如果只是处理json的话,没必要,里面的东西太多了。人生难得糊涂。