package serializers.json;
import java.io.*;
import serializers.*;
import data.media.MediaContent;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializeWriter;
import com.alibaba.fastjson.serializer.SerializeFilter;
/**
* This serializer uses FastJSON [https://github.com/alibaba/fastjson] for JSON data binding.
*/
public class FastJSONArrayDatabind
{
public static void register(TestGroups groups)
{
groups.media.add(JavaBuiltIn.mediaTransformer,
new GenericSerializer<MediaContent>("json-array/fastjson/databind", MediaContent.class),
new SerFeatures(
SerFormat.JSON,
SerGraph.FLAT_TREE,
SerClass.ZERO_KNOWLEDGE,
""
)
);
}
static class GenericSerializer<T> extends Serializer<T>
{
private final String name;
private final Class<T> type;
private int serializerFeatures;
public GenericSerializer(String name, Class<T> clazz)
{
this.name = name;
type = clazz;
serializerFeatures |= SerializerFeature.QuoteFieldNames.getMask();
serializerFeatures |= SerializerFeature.SkipTransientField.getMask();
serializerFeatures |= SerializerFeature.SortField.getMask();
serializerFeatures |= SerializerFeature.DisableCircularReferenceDetect.getMask();
serializerFeatures |= SerializerFeature.BeanToArray.getMask();
}
@Override
public String getName()
{
return name;
}
public void serializeItems(T[] items, OutputStream out) throws IOException
{
for (int i = 0, len = items.length; i < len; ++i) {
JSON.writeJSONString(out,
items[i],
serializerFeatures);
}
}
@SuppressWarnings("unchecked")
@Override
public T deserialize(byte[] array) throws Exception
{
// fastjson can parse from byte array, yay:
return (T) JSON.parseObject(array, type, Feature.SupportArrayToBean, Feature.DisableCircularReferenceDetect);
}
@Override
public byte[] serialize(T data) throws IOException
{
return JSON.toJSONBytes(data, serializerFeatures);
}
}
}