将对象的转化为json的封装jsonutil【直接放到其他项目中,适用性强】

第一步:在pom.xml添加依赖包

 <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.12</version>
    </dependency>

第二步:写一个JsonUtil的类,如下:

package com.mmall.util;

import com.google.common.collect.Lists;
import com.mmall.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.type.JavaType;
import org.codehaus.jackson.type.TypeReference;
import java.text.SimpleDateFormat;
import java.util.List;

//直接放到项目中,适用性强
@Slf4j
public class JsonUtil {
    private static ObjectMapper objectMapper=new ObjectMapper();
    static {
        //对象的所有字段全部例入
        objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.ALWAYS);
        //取消默认转换timestamps形式
        objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS,false);
        //忽略空bean转json的错误
        objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS,false);
        //所有的日期格式都统一为以下的格式,即为:yyyy-MM-dd HH:mm:ss
        objectMapper.setDateFormat(new SimpleDateFormat(DateTimeUtil.STANDARD_FORMAT));
        //忽略在json字符串存在,但在java对像中不存在对应属性的情况,防止错误
        objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
    }
    //对象转字符串
    public static <T> String obj2String(T obj){
        if(obj==null){
            return null;
        }
        try {
            return obj instanceof String ? (String)obj:objectMapper.writeValueAsString(obj);
        } catch (Exception e) {
            log.warn("Parse object to String error",e);
            return null;
        }
    }
    //返回格式化好的json字符串
    public static <T> String obj2StringPretty(T obj){
        if(obj==null){
            return null;
        }
        try {
            return obj instanceof String ? (String)obj:objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (Exception e) {
            log.warn("Parse object to String error",e);
            return null;
        }
    }
    //把字符串转成对象,第一个T表示将此方法声明为泛型方法,Class<T> clazz表示反序列化为什么类型
    public static <T> T string2Obj(String str,Class<T> clazz){
        if(StringUtils.isEmpty(str)||clazz==null){
            return null;
        }
        try {
            return clazz.equals(String.class)?(T)str:objectMapper.readValue(str,clazz);
        } catch (Exception e) {
            log.warn("Parse object to Object error",e);
            return null;
        }
    }
    //方法一,实现String userListStr=JsonUtil.obj2String(userList);这种的反序列化[重点]用于复杂的场景
    public static <T> T string2Obj(String str, TypeReference<T> typeReference){
        if(StringUtils.isEmpty(str)||typeReference==null){
            return null;
        }
        try {
            return (T)(typeReference.getType().equals(String.class)?(T)str:objectMapper.readValue(str,typeReference));
        } catch (Exception e) {
            log.warn("Parse object to Object error",e);
            return null;
        }
    }
    //方法二,?表示还没有确定返回值[重点]用于复杂的场景
    public static <T> T string2Obj(String str, Class<?> collectionClass,Class<?>... elementClass){
        JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionClass,elementClass);
        try {
            return objectMapper.readValue(str,javaType);
        } catch (Exception e) {
            log.warn("Parse object to Object error",e);
            return null;
        }
    }

    //使用主函数进行测试
    public static void main(String[] args) {
        User u1 =new User();
        u1.setId(1);
        u1.setPassword("12");
        User u2 =new User();
        u2.setId(2);
        u2.setPassword("23");
        String user1Json=JsonUtil.obj2String(u1);
        String user1JsonPretty=JsonUtil.obj2StringPretty(u1);
        log.info("user1Json:{}",user1Json);
        log.info("user1JsonPretty:{}",user1JsonPretty);

        User user = JsonUtil.string2Obj(user1Json,User.class);
        List<User> userList = Lists.newArrayList();
        userList.add(u1);
        userList.add(u2);
        String userListStr=JsonUtil.obj2String(userList);
        log.info(userListStr);
        //这是重点的方法
        List<User> userListObj1=JsonUtil.string2Obj(userListStr, new TypeReference<List<User>>() {
        });
        //这是重点的方法
        List<User> userList2=JsonUtil.string2Obj(userListStr,List.class,User.class);
    }
}

fastjson介绍备注:

需要引入 fastjson-1.2.40.jar包

FastJson的介绍
JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下FastJson,FastJson是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架;

FastJson的特点
1.FastJson数度快,无论序列化和反序列化,都是当之无愧的fast
2.功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
3.零依赖(没有依赖其它任何类库);

FastJson的简单说明
FastJson对于json格式字符串的解析主要用到了下面三个类:
1.JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
2.JSONObject:fastJson提供的json对象
3.JSONArray:fastJson提供json数组对象;
 

发布了241 篇原创文章 · 获赞 145 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Richard_666/article/details/103497970
今日推荐