package com.chinacreator.process.util;

import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

public class JsonUtil {

	private static Gson gson = null;  
    
    static {  
        if (gson == null) {  
            gson = new Gson();  
        }  
    }  
  
    private JsonUtil() {  
      
    }  
  
    /** 
     * 将对象转换成json格式 
     *  
     * @param ts 
     * @return 
     */  
    public static String objectToJson(Object ts) {  
        String jsonStr = null;  
        if (gson != null) {  
            jsonStr = gson.toJson(ts);  
        }  
        return jsonStr;  
    }  
  
    /** 
     * 将对象转换成json格式(并自定义日期格式) 
     *  
     * @param ts 
     * @return 
     */  
    public static String objectToJsonDateSerializer(Object ts,  
            final String dateformat) {
        String jsonStr = null;  
        gson = new GsonBuilder().registerTypeHierarchyAdapter(Date.class, new JsonSerializer<Date>() {  
                            public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {  
                                SimpleDateFormat format = new SimpleDateFormat(dateformat);  
                                return new JsonPrimitive(format.format(src));  
                            }  
                        }).setDateFormat(dateformat).create();  
        if (gson != null) {  
            jsonStr = gson.toJson(ts);  
        }  
        return jsonStr;  
    }  
  
    /** 
     * 将json格式转换成list对象 
     *  
     * @param jsonStr 
     * @return 
     */  
    public static List<?> jsonToList(String jsonStr) {  
        List<?> objList = null;  
        if (gson != null) {  
            java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<?>>() {  
            }.getType();  
            objList = gson.fromJson(jsonStr, type);  
        }  
        return objList;  
    }  
      
    /** 
     * 将json格式转换成list对象，并准确指定类型 
     * @param jsonStr 
     * @param type 
     * @return 
     */  
    public static List<?> jsonToList(String jsonStr, java.lang.reflect.Type type) {  
        List<?> objList = null;  
        if (gson != null) {  
            objList = gson.fromJson(jsonStr, type);  
        }  
        return objList;  
    }  
  
    /** 
     * 将json格式转换成map对象 
     *  
     * @param jsonStr 
     * @return 
     */  
    public static Map<?, ?> jsonToMap(String jsonStr) {  
        Map<?, ?> objMap = null;  
        if (gson != null) {  
            java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<Map<?, ?>>() {}.getType();  
            objMap = gson.fromJson(jsonStr, type);  
        }  
        return objMap;  
    }  
  
    /** 
     * 将json转换成bean对象 
     *  
     * @param jsonStr 
     * @return 
     */  
    public static Object jsonToBean(String jsonStr, Class<?> cl) {  
        Object obj = null;  
        if (gson != null) {  
        //	java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<cl>() {}.getType();
            obj = gson.fromJson(jsonStr, cl);  
        }  
        return obj;  
    }  
  
    /** 
     * 将json转换成bean对象 
     *  
     * @param jsonStr 
     * @param cl 
     * @return 
     */  
    @SuppressWarnings("unchecked")  
    public static <T> T jsonToBeanDateSerializer(String jsonStr, Class<T> cl,  final String pattern) {  
        Object obj = null;  
        gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {  
                    public Date deserialize(JsonElement json, Type typeOfT,JsonDeserializationContext context)  
                            throws JsonParseException {  
                        SimpleDateFormat format = new SimpleDateFormat(pattern);  
                        String dateStr = json.getAsString();  
                        try {  
                            return format.parse(dateStr);  
                        } catch (java.text.ParseException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}  
                        return null;  
                    }  
                }).setDateFormat(pattern).create();  
        if (gson != null) {  
            obj = gson.fromJson(jsonStr, cl);  
        }  
        return (T) obj;  
    }  
  
    /** 
     * 根据 
     * 
     * @param jsonStr 
     * @param key 
     * @return 
     */  
    public static Object getJsonValue(String jsonStr, String key) {  
        Object rulsObj = null;  
        Map<?, ?> rulsMap = jsonToMap(jsonStr);  
        if (rulsMap != null && rulsMap.size() > 0) {  
            rulsObj = rulsMap.get(key);  
        }  
        return rulsObj;  
    }  
    
    public static void main(String[] args) {
    	String str = "{\"cpid\":\"sohu\",\"channel\":null,\"output\":\"{\\\"errorinfo\\\":\\\"您号码的归属地北京暂未开放该业务，敬请期待。\\\",\\\"resultcode\\\":\\\"9001\\\"}\",\"action\":\"com.chinacreator.videoalliance.net.action.NetNumberAction\",\"method\":\"doNet\",\"userid\":\"null\",\"useragent\":\"Dalvik/2.1.0 (Linux; U; Android 6.0.1; HUAWEI RIO-AL00 Build/HuaweiRIO-AL00):port=8092\",\"resultcode\":\"9001\",\"errorinfo\":\"您号码的归属地北京暂未开放该业务，敬请期待。\",\"params\":\"cpid=sohu&response=3be61c0365cf51fb5dd9635d6e0346b5&backurl=&apptype=2&timestamp=1510630703\",\"referer\":null,\"hostip\":\"10.199.99.141\",\"hostport\":\"8051\",\"userip\":\"114.242.249.213\",\"apptype\":\"Android\"} ";
    	Map<?,?> map = JsonUtil.jsonToMap(str);
    	System.out.println(JsonUtil.getJsonValue(str, "output"));
    	//System.out.println(map.get("cpid"));
    	System.out.println(map.get("output"));
    	//System.out.println(map.get("cpid"));
	}
	
}
