关于泛型中包含级联的List转化为json数据的处理

今天,在我想要将List<User>转换为json数据返回时与遇到了两个问题:

    net.sf.json.JSONException: java.lang.reflect.InvocationTargetException

这个异常首先是因为User类中有Date类型的数据,在JSONArray.fromObject(list)时会出现这个错误,所以解决方法有两种:

1. 修改实体类Date类型的get方法(不过,不建议直接修改实体类的get方法):

    public String getUserBirthday() {
        return new Date(userBirthday.getTime());
    }

不过这个转换成json数据后,样子是这样的:


显然不是我所想要的,所以加一个工具类,格式化日期:

package com.utils;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class JsonDateValueProcessor implements JsonValueProcessor {

    private String datePattern = "yyyy-MM-dd HH:mm:ss";

    public JsonDateValueProcessor() {
        super();
    }

    public JsonDateValueProcessor(String format) {
        super();
        this.datePattern = format;
    }

    public Object processArrayValue(Object value, JsonConfig jsonConfig) {
        return process(value);
    }

    public Object processObjectValue(String key, Object value,
                                     JsonConfig jsonConfig) {
        return process(value);
    }

    private Object process(Object value) {
        try {
            if (value instanceof Date) {
                SimpleDateFormat sdf = new SimpleDateFormat(datePattern,Locale.UK);
                return sdf.format((Date) value);
            }
            return value == null ? "" : value.toString();
        } catch (Exception e) {
            return "";
        }
    }

    public String getDatePattern() {
        return datePattern;
    }

    public void setDatePattern(String pDatePattern) {
        datePattern = pDatePattern;
    }
}

然后在Action中添加:

JsonConfig config = new JsonConfig();      
JsonDateValueProcessor jsonValueProcessor = new JsonDateValueProcessor();  
config.registerJsonValueProcessor(Date.class, jsonValueProcessor); // 把日期格式化了
config.setExcludes(new String[] {"uploadSet","user_barrageSet","user_likeSet","user_favSet"}); //忽略集合
JSONArray userlist = JSONArray.fromObject(list, config);

得到的效果:


2. 把这个Date类型的数据,不使用Date类型而使用String类型。

扫描二维码关注公众号,回复: 1064311 查看本文章
    private String userBirthday;

另外一个问题则是:

    net.sf.json.JSONException object “net.sf.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

问题原因是因为泛型User中有着HashSet级联的原因,所以需要忽略掉这个HashSet

JsonConfig config = new JsonConfig();
config.setExcludes(new String[] {"uploadSet","user_barrageSet"});
JSONArray userlist = JSONArray.fromObject(list, config);

猜你喜欢

转载自blog.csdn.net/qq_33271690/article/details/80075389