2021SC@SDUSC
方法说明
方法的使用:
User user = new User("kk","123");
String s = toJSONString(user);
System.out.println(s);
得到的输出为:
可以看到,通过toJSONString这个方法可以得到一个将java对象转为json表示方式的字符串,下面我们来根据源码分析一下这个代码。
方法分析
该方法是定义在JSON这个类中的。
这是原方法,我们可以看到,通过传入一个对象Object的方式,在这个方法内部调用了其重载方法。
public static String toJSONString(Object object) {
return toJSONString(object, emptyFilters);
}
其中emptyFilters是JSON类的开头定义的静态变量,emptyFilters是一个SerializeFilter数组的实例,在fastjson中SerializeFilter是一个空接口
static final SerializeFilter[] emptyFilters = new SerializeFilter[0];
重载的toJSONString方法又调用另一个重载方法
参数说明
Object object:传入的要转为json字符串的object对象
SerializeFilter[] filters:上一个方法附加的序列化过滤器接口对象,这里如果上一个调用的方法只传入一个object,则此处也为null
SerializerFeature… features:可变长度的的序列化特征,其中SerializerFeature是一个枚举类,当前未传入序列化特征
public static String toJSONString(Object object, SerializeFilter[] filters, SerializerFeature... features) {
return toJSONString(object, SerializeConfig.globalInstance, filters, null, DEFAULT_GENERATE_FEATURE, features);
}
这是toJSONString方法的实现。
参数说明:
Object object:传入的java对象
SerializeConfig config:
传入的参数是SerializeConfig的一个全局的实例
SerializeFilter[] filters:方法调用之初传入的一个空值
String dateFormat:前面的调用方法传进来的为null
int defaultFeatures:这里传入的是JSON的一个全局变量,如下图
SerializerFeature… features:可变序列化特征值,初始调用重载方法的也传的是空值。
首先,该方法实例化了一个SerializeWriter对象,这个对象继承了Writer类。
然后调用了这个类的write方法。
public static String toJSONString(Object object, //
SerializeConfig config, //
SerializeFilter[] filters, //
String dateFormat, //
int defaultFeatures, //
SerializerFeature... features) {
SerializeWriter out = new SerializeWriter(null, defaultFeatures, features);
try {
JSONSerializer serializer = new JSONSerializer(out, config);
if (dateFormat != null && dateFormat.length() != 0) {
serializer.setDateFormat(dateFormat);
serializer.config(SerializerFeature.WriteDateUseDateFormat, true);
}
if (filters != null) {
for (SerializeFilter filter : filters) {
serializer.addFilter(filter);
}
}
serializer.write(object);
return out.toString();
} finally {
out.close();
}
}
我们来看SerializeWriter,可以看到,调用SerializeWriter的writer就是在调用
ObjectWriter的write方法;
public final void write(Object object) {
if (object == null) {
out.writeNull();
return;
}
Class<?> clazz = object.getClass();
ObjectSerializer writer = getObjectWriter(clazz);
try {
writer.write(this, object, null, null, 0);
} catch (IOException e) {
throw new JSONException(e.getMessage(), e);
}
}
最后返回的这个toString就是打印出的json类型的字符串