package com.alibaba.json.test.codec; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Type; import java.util.Collection; import java.util.List; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fastjson.serializer.ObjectSerializer; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializeWriter; import com.alibaba.fastjson.serializer.SerializerFeature; import data.media.Image; import data.media.Media; import data.media.MediaContent; public class FastjsonManualCodec implements Codec { private ParserConfig config = new ParserConfig(); private SerializeConfig serializeConfig = new SerializeConfig(); public FastjsonManualCodec(){ System.out.println("fastjson-" + JSON.VERSION); serializeConfig.put(MediaContent.class, new MediaContentSerializer()); } public String getName() { return "fastjson-manual"; } public <T> T decodeObject(String text, Class<T> clazz) { DefaultJSONParser parser = new DefaultJSONParser(text, config); parser.config(Feature.DisableCircularReferenceDetect, true); return parser.parseObject(clazz); } public <T> Collection<T> decodeArray(String text, Class<T> clazz) throws Exception { DefaultJSONParser parser = new DefaultJSONParser(text, config); parser.config(Feature.DisableCircularReferenceDetect, true); return parser.parseArray(clazz); } public final Object decodeObject(String text) { DefaultJSONParser parser = new DefaultJSONParser(text, config); parser.config(Feature.DisableCircularReferenceDetect, true); return parser.parse(); } public final Object decode(String text) { DefaultJSONParser parser = new DefaultJSONParser(text, config); parser.config(Feature.DisableCircularReferenceDetect, true); return parser.parse(); } // private JavaBeanSerializer serializer = new JavaBeanSerializer(Long_100_Entity.class); public String encode(Object object) throws Exception { SerializeWriter out = new SerializeWriter(); out.config(SerializerFeature.DisableCircularReferenceDetect, true); JSONSerializer serializer = new JSONSerializer(out, serializeConfig); serializer.write(object); String text = out.toString(); out.close(); return text; } @SuppressWarnings("unchecked") public <T> T decodeObject(byte[] input, Class<T> clazz) throws Exception { return (T) JSON.parseObject(input, clazz, Feature.DisableCircularReferenceDetect); } public static class ImageSerializer implements ObjectSerializer { @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { Image image = (Image) object; SerializeWriter out = serializer.out; out.writeFieldValue('{', "height", image.getHeight()); out.writeFieldValueStringWithDoubleQuote(',', "size", image.getSize().name()); String tile = image.getTitle(); out.writeFieldValueStringWithDoubleQuoteCheck(',', "title", tile); out.writeFieldValueStringWithDoubleQuoteCheck(',', "uri", image.getUri()); out.writeFieldValue(',', "width", image.getWidth()); out.write('}'); // TODO } } public static class MediaSerializer implements ObjectSerializer { @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { Media image = (Media) object; SerializeWriter out = serializer.out; out.writeFieldValue('{', "bitrate", image.getBitrate()); out.writeFieldValue(',', "duration", image.getDuration()); out.writeFieldValue(',', "height", image.getHeight()); String format = image.getFormat(); out.writeFieldValueStringWithDoubleQuoteCheck(',', "format", format); out.writeFieldValue(',', "size", image.getSize()); out.writeFieldValue(',', "height", image.getHeight()); List<String> persons = image.getPersons(); out.writeFieldName("persons"); out.write(persons); out.writeFieldValueStringWithDoubleQuote(',', "player", image.getPlayer().name()); out.writeFieldValue(',', "size", image.getSize()); String title = image.getTitle(); out.writeFieldValue(',', "title", title); String uri = image.getUri(); out.writeFieldValueStringWithDoubleQuoteCheck(',', "uri", uri); out.writeFieldValue(',', "width", image.getWidth()); out.write('}'); } } public static class MediaContentSerializer implements ObjectSerializer { MediaSerializer mediaSer = new MediaSerializer(); ImageSerializer imageSer = new ImageSerializer(); @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { MediaContent mediaContent = (MediaContent) object; SerializeWriter out = serializer.out; out.write('{'); out.writeFieldName("image", false); List<Image> images = mediaContent.images; out.write('['); for (int i = 0, size = images.size(); i < size; ++i) { if (i != 0) { out.write(','); } Image image = images.get(i); imageSer.write(serializer, image, Integer.valueOf(i), Image.class, features); } out.write(']'); out.write(','); out.writeFieldName("media", false); mediaSer.write(serializer, mediaContent.media, "media", Media.class, features); out.write('}'); } } @Override public byte[] encodeToBytes(Object object) throws Exception { // TODO Auto-generated method stub return null; } @Override public void encode(OutputStream out, Object object) throws Exception { out.write(encodeToBytes(object)); } }