001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.json;
016    
017    import com.liferay.portal.kernel.json.JSONSerializer;
018    import com.liferay.portal.kernel.json.JSONTransformer;
019    
020    import jodd.json.JoddJson;
021    import jodd.json.JsonContext;
022    import jodd.json.JsonSerializer;
023    import jodd.json.TypeJsonSerializer;
024    
025    import org.json.JSONArray;
026    import org.json.JSONObject;
027    
028    /**
029     * @author Igor Spasic
030     */
031    public class JSONSerializerImpl implements JSONSerializer {
032    
033            public JSONSerializerImpl() {
034                    _jsonSerializer = new JsonSerializer();
035            }
036    
037            @Override
038            public JSONSerializerImpl exclude(String... fields) {
039                    _jsonSerializer.exclude(fields);
040    
041                    return this;
042            }
043    
044            @Override
045            public JSONSerializerImpl include(String... fields) {
046                    _jsonSerializer.include(fields);
047    
048                    return this;
049            }
050    
051            @Override
052            public String serialize(Object target) {
053                    return _jsonSerializer.serialize(target);
054            }
055    
056            @Override
057            public String serializeDeep(Object target) {
058                    return _jsonSerializer.deep(true).serialize(target);
059            }
060    
061            @Override
062            public JSONSerializerImpl transform(
063                    JSONTransformer jsonTransformer, Class<?> type) {
064    
065                    TypeJsonSerializer<?> typeJsonSerializer = null;
066    
067                    if (jsonTransformer instanceof TypeJsonSerializer) {
068                            typeJsonSerializer = (TypeJsonSerializer<?>)jsonTransformer;
069                    }
070                    else {
071                            typeJsonSerializer = new JoddJsonTransformer(jsonTransformer);
072                    }
073    
074                    _jsonSerializer.use(type, typeJsonSerializer);
075    
076                    return this;
077            }
078    
079            @Override
080            public JSONSerializerImpl transform(
081                    JSONTransformer jsonTransformer, String field) {
082    
083                    TypeJsonSerializer<?> typeJsonSerializer = null;
084    
085                    if (jsonTransformer instanceof TypeJsonSerializer) {
086                            typeJsonSerializer = (TypeJsonSerializer<?>)jsonTransformer;
087                    }
088                    else {
089                            typeJsonSerializer = new JoddJsonTransformer(jsonTransformer);
090                    }
091    
092                    _jsonSerializer.use(field, typeJsonSerializer);
093    
094                    return this;
095            }
096    
097            static {
098                    JoddJson.defaultSerializers.register(
099                            JSONArray.class, new JSONArrayTypeJSONSerializer());
100                    JoddJson.defaultSerializers.register(
101                            JSONObject.class, new JSONObjectTypeJSONSerializer());
102                    JoddJson.defaultSerializers.register(
103                            Long.TYPE, new LongToStringTypeJSONSerializer());
104                    JoddJson.defaultSerializers.register(
105                            Long.class, new LongToStringTypeJSONSerializer());
106            }
107    
108            private final JsonSerializer _jsonSerializer;
109    
110            private static class JSONArrayTypeJSONSerializer
111                    implements TypeJsonSerializer<JSONArray> {
112    
113                    @Override
114                    public void serialize(JsonContext jsonContext, JSONArray jsonArray) {
115                            jsonContext.write(jsonArray.toString());
116                    }
117    
118            }
119    
120            private static class JSONObjectTypeJSONSerializer
121                    implements TypeJsonSerializer<JSONObject> {
122    
123                    @Override
124                    public void serialize(JsonContext jsonContext, JSONObject jsonObject) {
125                            jsonContext.write(jsonObject.toString());
126                    }
127    
128            }
129    
130            private static class LongToStringTypeJSONSerializer
131                    implements TypeJsonSerializer<Long> {
132    
133                    @Override
134                    public void serialize(JsonContext jsonContext, Long value) {
135                            jsonContext.writeString(Long.toString(value));
136                    }
137    
138            }
139    
140    }