All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yunpian.sdk.util.JsonUtil Maven / Gradle / Ivy

package com.yunpian.sdk.util;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;

public class JsonUtil {
    private static final Gson Gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

    // private static final Type TypeMap = new TypeToken>()
    // {
    // }.getType();

    public static  T fromJson(String json, Class clazz) {
        if (json == null || "".equals(json))
            return null;
        return Gson.fromJson(json, clazz);
    }

    public static String toJson(Object obj) {
        return Gson.toJson(obj);
    }

    /**
     * TODO 优化
     * 
     * @param json
     * @return
     * @throws IOException
     */
    public static Map fromJsonToMap(String json) throws IOException {
        return toMapStr(json);
    }

    public static  T fromJsonToMap(Reader json, Type type) {
        return Gson.fromJson(json, type);
    }

    public static  T fromJson(String json, Type t) {
        return Gson.fromJson(json, t);
    }

    public static  T fromJson(Reader json, Type t) {
        return Gson.fromJson(json, t);
    }

    private static Map toMapStr(String json) throws IOException {
        try (JsonReader in = new JsonReader(new StringReader(json))) {
            JsonToken token = in.peek();
            if (token.equals(JsonToken.BEGIN_OBJECT)) {
                Map map = new LinkedHashMap<>();
                in.beginObject();
                while (in.hasNext()) {
                    map.put(in.nextName(), read2Str(in, true).toString());
                }
                in.endObject();
                return map;
            }
            return Collections.emptyMap();
        }
    }

    private static Object read2Str(JsonReader in, boolean str) throws IOException {
        JsonToken token = in.peek();
        switch (token) {
        case BEGIN_ARRAY:
            List list = new LinkedList();
            in.beginArray();
            while (in.hasNext()) {
                list.add(read2Str(in, false));
            }
            in.endArray();
            return str ? JsonUtil.toJson(list) : list;

        case BEGIN_OBJECT:
            Map map = new LinkedHashMap();
            in.beginObject();
            while (in.hasNext()) {
                map.put(in.nextName(), read2Str(in, false));
            }
            in.endObject();
            return str ? JsonUtil.toJson(map) : map;

        case STRING:
            return in.nextString();

        case NUMBER:
            return in.nextString();
        case BOOLEAN:
            return in.nextBoolean();

        case NULL:
            in.nextNull();
            return "";
        default:
            return in.nextString();
        }
    }

}