//The equivalent of a SerializedPropertyField but for objects serialized using JSON.
            public static T ObjectField <T>(T obj, GUIContent label, out bool dataChanged)
            {
                //If object is an array show an editable array field
                if (typeof(T).IsArray)
                {
                    bool  arrayChanged = false;
                    Array arrayObj     = obj as Array;
                    arrayObj = ArrayField(label, arrayObj, typeof(T).GetElementType(), ref arrayChanged);

                    if (arrayChanged)
                    {
                        dataChanged = true;
                        return((T)(arrayObj as object));
                    }

                    dataChanged = false;
                    return(obj);
                }

                //If the object is a IJSONCustomEditable then just need to call its render properties function.
                if (obj != null && obj is IJSONCustomEditable)
                {
                    dataChanged = ((IJSONCustomEditable)obj).RenderObjectProperties(label);
                    return(obj);
                }

                Type objType = obj == null ? typeof(T) : obj.GetType();

                //Otherwise check the class has a object editor class associated with it.
                JSONEditorAttribute.RenderPropertiesDelegate renderPropertiesDelegate = GetEditorDelegateForObject(objType);
                if (renderPropertiesDelegate != null)
                {
                    //If it has one then just need to call its render properties function.
                    return((T)renderPropertiesDelegate(obj, label, out dataChanged));
                }

                //Otherwise loop through each JSON field in object and render each as a property field
                {
                    dataChanged = false;
                    JSONField[] JSONFields = JSONConverter.GetJSONFields(objType);
                    foreach (JSONField JSONField in JSONFields)
                    {
                        if (!JSONField.HideInEditor())
                        {
                            //Create GUIContent for label and optional tooltip
                            string           fieldName       = StringUtils.FromCamelCase(JSONField.GetID());
                            TooltipAttribute fieldToolTipAtt = SystemUtils.GetAttribute <TooltipAttribute>(JSONField);
                            GUIContent       labelContent    = fieldToolTipAtt != null ? new GUIContent(fieldName, fieldToolTipAtt.tooltip) : new GUIContent(fieldName);

                            bool   fieldChanged;
                            object nodeFieldObject = JSONField.GetValue(obj);

                            if (JSONField.GetFieldType().IsArray)
                            {
                                fieldChanged    = false;
                                nodeFieldObject = ArrayField(labelContent, nodeFieldObject as Array, JSONField.GetFieldType().GetElementType(), ref fieldChanged);
                            }
                            else
                            {
                                nodeFieldObject = ObjectField(nodeFieldObject, labelContent, out fieldChanged);
                            }

                            if (fieldChanged)
                            {
                                dataChanged = true;
                                JSONField.SetValue(obj, nodeFieldObject);
                            }
                        }
                    }

                    return(obj);
                }
            }