Package com.extjs.gxt.ui.client.js

Source Code of com.extjs.gxt.ui.client.js.JsonConverter

/*
* Ext GWT 2.2.4 - Ext for GWT
* Copyright(c) 2007-2010, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.js;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.extjs.gxt.ui.client.core.FastMap;
import com.extjs.gxt.ui.client.data.ModelData;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONNull;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;

/**
* Helper class to decode and encode objects to and from Json. Converter handles
* simple data types (strings, numbers, booleans) and lists and maps.
*/
@SuppressWarnings("deprecation")
public class JsonConverter {

  /**
   * Decodes a Json string into a map.
   *
   * @param jsonString the Json string
   * @return the map
   */
  public static Map<String, Object> decode(String jsonString) {
    JSONValue v = JSONParser.parse(jsonString);
    if (v.isObject() != null) {
      return decode(v.isObject());
    } else {
      return null;
    }
  }

  /**
   * Decodes a JSONObject to a map.
   *
   * @param jso the JSONObject
   * @return the map
   */
  public static Map<String, Object> decode(JSONObject jso) {
    Map<String, Object> map = new FastMap<Object>();
    for (String key : jso.keySet()) {
      JSONValue j = jso.get(key);
      if (j.isObject() != null) {
        map.put(key, decode(j.isObject()));
      } else if (j.isArray() != null) {
        map.put(key, decodeToList(j.isArray()));
      } else if (j.isBoolean() != null) {
        map.put(key, j.isBoolean().booleanValue());
      } else if (j.isString() != null) {
        map.put(key, decodeValue(j.isString().stringValue()));
      }
    }
    return map;
  }

  /**
   * Encodes a map into a JSONObject.
   *
   * @param map the map
   * @return the JSONObject
   */
  public static JSONObject encode(Map<String, Object> map) {
    return encodeMap((Map<String, Object>) map);
  }

  /**
   * Encodes a model data instance into a JSONObject.
   *
   * @param model the model data object
   * @return the JSONObject
   */
  public static JSONObject encode(ModelData model) {
    return encodeMap(((ModelData) model).getProperties());
  }

  protected static Object decodeValue(String value) {
    try {
      if (value == null || value.length() < 3) {
        return null;
      }
      String type = value.substring(0, 2);
      String val = value.substring(2);
      if (type.equals("d:")) {
        long time = Long.parseLong(val);
        return new Date(time);
      } else if (type.equals("i:")) {
        return Integer.decode(val);
      } else if (type.equals("f:")) {
        return new Float(val);
      }
      return val;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  protected static List<Object> decodeToList(JSONArray array) {
    List<Object> list = new ArrayList<Object>();
    for (int i = 0; i < array.size(); i++) {
      JSONValue v = array.get(i);
      if (v.isObject() != null) {
        list.add(decode(v.isObject()));
      } else if (v.isArray() != null) {
        list.add(decodeToList(v.isArray()));
      } else if (v.isNull() != null) {
        list.add(null);
      } else if (v.isNumber() != null) {
        list.add(v.isNumber().doubleValue());
      } else if (v.isBoolean() != null) {
        list.add(v.isBoolean().booleanValue());
      } else if (v.isString() != null) {
        list.add(decodeValue(v.isString().stringValue()));
      }
    }

    return list;
  }

  protected static String encodeValue(Object value) {
    if (value instanceof Date) {
      return "d:" + ((Date) value).getTime();
    } else if (value instanceof Integer) {
      return "i:" + value;
    } else if (value instanceof Float) {
      return "f:" + value;
    }
    return "s:" + value.toString();
  }

  @SuppressWarnings("unchecked")
  protected static JSONObject encodeMap(Map<String, Object> data) {
    JSONObject jsobj = new JSONObject();
    for (String key : data.keySet()) {
      Object val = data.get(key);
      if (val instanceof String) {
        jsobj.put(key, new JSONString(encodeValue(val)));
      } else if (val instanceof Date) {
        jsobj.put(key, new JSONString(encodeValue(val)));
      } else if (val instanceof Number) {
        jsobj.put(key, new JSONString(encodeValue(val)));
      } else if (val instanceof Boolean) {
        jsobj.put(key, JSONBoolean.getInstance((Boolean) val));
      } else if (val == null) {
        jsobj.put(key, JSONNull.getInstance());
      } else if (val instanceof Map) {
        jsobj.put(key, encodeMap((Map<String, Object>) val));
      } else if (val instanceof List) {
        jsobj.put(key, encodeList((List<Object>) val));
      } else if (val instanceof ModelData) {
        jsobj.put(key, encodeMap(((ModelData) val).getProperties()));
      }
    }

    return jsobj;
  }

  @SuppressWarnings("unchecked")
  protected static JSONArray encodeList(List<Object> data) {
    JSONArray jsona = new JSONArray();
    for (int i = 0; i < data.size(); i++) {
      Object val = data.get(i);
      if (val instanceof ModelData) {
        jsona.set(i, encodeMap(((ModelData) val).getProperties()));
      } else if (val instanceof Map) {
        jsona.set(i, encodeMap((Map<String, Object>) val));
      } else if (val instanceof List) {
        jsona.set(i, encodeList((List<Object>) val));
      } else if (val instanceof String) {
        jsona.set(i, new JSONString(encodeValue(val)));
      } else if (val instanceof Number) {
        jsona.set(i, new JSONString(encodeValue(val)));
      } else if (val instanceof Boolean) {
        jsona.set(i, JSONBoolean.getInstance((Boolean) val));
      } else if (val == null) {
        jsona.set(i, JSONNull.getInstance());
      } else if (val instanceof Date) {
        jsona.set(i, new JSONString(encodeValue(val)));
      }
    }
    return jsona;
  }
}
TOP

Related Classes of com.extjs.gxt.ui.client.js.JsonConverter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.