Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2013-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
   *
   * Licensed under the Apache License, Version 2.0 (the "License").
   * You may not use this file except in compliance with the License.
   * A copy of the License is located at
   *
   *  http://aws.amazon.com/apache2.0
   *
  * or in the "license" file accompanying this file. This file is distributed
  * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
  * express or implied. See the License for the specific language governing
  * permissions and limitations under the License.
  */
 package com.amazonaws.util.json;
 
 import java.util.List;
 
 
 public class JSONUtils {
    
Load a JSON string into an instantiated object. All the public fields of the object will be set by the values in the JSON string associated with the field name.
Because of the naming convention in Java, the first letter of the field name will be capitalized for another look-up in the JSON, if the original field name is not found.

Parameters:
clazz Class of the object which the JSON string would be loaded into.
source JSON string.
Returns:
An instantiated object of the given Class
Throws:
JSONException
 
     public static <T> T toObject (Class<T> clazzString sourcethrows JSONException {
     	JSONObject jsonObect = new JSONObject(source);
     	try {
 			return toObject(clazzjsonObect);
 		} catch (Exception e) {
 			throw new JSONException(e);
 		}
     }
     
     private static <T> T toObject(Class<T> clazzJSONObject jsonObjectthrows JSONExceptionIllegalArgumentExceptionIllegalAccessException {
     	T newObject;
     	try {
     		newObject = createInstance(clazz);
     	} catch (Exception e){
     		throw new AmazonClientException("Failed to instantiate class"e);
     	}
     	for (Field objectField : clazz.getFields()) {
     		String fieldName = objectField.getName();
     		Class<?> fieldType = objectField.getType();
     		Object fieldValue;
     		try {
     			fieldValue = parseField(jsonObjectfieldTypefieldName);
     		} catch (Exception e) {
     			fieldValue = parseField(jsonObjectfieldTypefieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));
     		}
     		objectField.set(newObjectfieldValue);
     	}
     	return newObject;
     }
    
    
Get the value associated with a key, and parse it according to the provided Class.
 
     private static Object parseField(JSONObject jsonObjectClass<?> clazzString keythrows JSONExceptionIllegalArgumentExceptionIllegalAccessException {
 		// Boolean
 		if (clazz.equals(Boolean.class) || clazz.equals(boolean.class))
 			return jsonObject.getBoolean(key);
 		// Double
 		else if (clazz.equals(Double.class) || clazz.equals(double.class))
 			return jsonObject.getDouble(key);
 		// Integer
 		else if (clazz.equals(Integer.class) || clazz.equals(int.class))
 			return jsonObject.getInt(key);
 		// Long
 		else if (clazz.equals(Long.class) || clazz.equals(long.class))
 			return jsonObject.getLong(key);
 		// String
 		else if (clazz.equals(String.class))
 			return jsonObject.getString(key);
 		// Char
 		else if (clazz.equals(Character.class) || clazz.equals(char.class))
 			return jsonObject.getString(key).charAt(0);
 		// Array
 		else if (clazz.isArray()) {
 			Class<?> componentType = clazz.getComponentType();
 			JSONArray jsonArray = jsonObject.getJSONArray(key);
 			Object array = Array.newInstance(componentTypejsonArray.length());
 			for (int i = 0; i < jsonArray.length(); i++) {
 				Array.set(arrayiparseField(jsonArraycomponentTypei));
			}
			return array;
		}
		// Handled as a nested Class object
		else {
			JSONObject nestedObject = jsonObject.getJSONObject(key);
			return toObject(clazznestedObject);
		}
    }
    
    
Get the value associated with an index, and parse it according to the provided Class.
    private static Object parseField(JSONArray jsonArrayClass<?> clazzint indexthrows JSONExceptionIllegalArgumentExceptionIllegalAccessException {
		// Boolean
		if (clazz.equals(Boolean.class) || clazz.equals(boolean.class))
			return jsonArray.getBoolean(index);
		// Double
		else if (clazz.equals(Double.class) || clazz.equals(double.class))
			return jsonArray.getDouble(index);
		// Integer
		else if (clazz.equals(Integer.class) || clazz.equals(int.class))
			return jsonArray.getInt(index);
		// Long
		else if (clazz.equals(Long.class) || clazz.equals(long.class))
			return jsonArray.getLong(index);
		// String
		else if (clazz.equals(String.class))
			return jsonArray.getString(index);
		// Char
		else if (clazz.equals(Character.class) || clazz.equals(char.class))
			return jsonArray.getString(index).charAt(0);
		// Array
		else if (clazz.isArray()) {
			Class<?> componentType = clazz.getComponentType();
			JSONArray nestedJSONArray = jsonArray.getJSONArray(index);
			List<Objectlist = new LinkedList<Object>();
			for (int i = 0; i < jsonArray.length(); i++) {
				list.add(parseField(nestedJSONArraycomponentTypei));
			}
			return list.toArray();
		}
		// Handled as a nested Class object
		else {
			JSONObject nestedObject = jsonArray.getJSONObject(index);
			return toObject(clazznestedObject);
		}  	
    }
    
	private static <T> T createInstance(Class<T> clazz)
        T instanceToReturn = null;
        Class< ? > enclosingClass = clazz.getEnclosingClass();
        if (enclosingClass != null) {
            Object instanceOfEnclosingClass = createInstance(enclosingClass);
            Constructor<T> ctor = clazz.getConstructor(enclosingClass);
            if (ctor != null) {
        		instanceToReturn = ctor.newInstance(instanceOfEnclosingClass);
            }
        } else {
            instanceToReturn = clazz.newInstance();
        }
        
        return instanceToReturn;
    }
New to GrepCode? Check out our FAQ X