/// <summary>
        /// Evaluates the expression and populates an existing object with keys and values.
        /// </summary>
        /// <param name="expression">the expression to evaluate</param>
        /// <param name="existingObject">the existing object to populate</param>
        /// <param name="deserializer">the deserializer instance to use to deserialize other expressions</param>
        /// <returns>a populated object</returns>
        public override object Evaluate(Expression expression, object existingObject, IDeserializerHandler deserializer)
        {
            Type _dictionaryKeyType = typeof(string);
            Type _dictionaryValueType = null;
            Type genDict = existingObject.GetType().GetInterface(typeof(IDictionary<,>).Name);
            // attempt to figure out what the types of the values are, if no type is set already
            if (genDict != null)
            {
                Type[] genArgs = genDict.GetGenericArguments();
                _dictionaryKeyType = genArgs[0];
                _dictionaryValueType = genArgs[1];
            }

            ObjectExpression objectExpression = CastExpression<ObjectExpression>(expression);
            foreach (KeyValueExpression keyValue in objectExpression.Properties)
            {
                // if no type set, set one
                keyValue.KeyExpression.ResultType = _dictionaryKeyType;
                if (_dictionaryValueType != null)
                    keyValue.ValueExpression.ResultType = _dictionaryValueType;

                object keyObject = deserializer.Evaluate(keyValue.KeyExpression);
                object result = deserializer.Evaluate(keyValue.ValueExpression);
                ((IDictionary)existingObject)[keyObject] = result;
            }
            return existingObject;
        }
示例#2
0
 protected virtual void WriteCast(Expression Expression)
 {
     CastExpression cast = (CastExpression)Expression;
     if (outputTypeInfo && !(cast.Expression is ReferenceExpression))
         jsonWriter.WriteCast(cast.ResultType);
     Write(cast.Expression);
 }
示例#3
0
 public Expression Execute(Expression root)
 {
     IList<ReferenceExpression> references = CollectReferences(root);
     foreach (ReferenceExpression reference in references)
         ResolveReference(reference, root);
     return root;
 }
示例#4
0
 public KeyValueExpression(Expression key, Expression value)
 {
     _keyExpression = key;
     _valueExpression = value;
     this.LineNumber = key.LineNumber;
     this.CharacterPosition = key.CharacterPosition;
 }
示例#5
0
 private static void ResolveReference(ReferenceExpression reference, Expression root)
 {
     ReferenceVisitor visitor = new ReferenceVisitor(reference.Path);
     visitor.Visit(root);
     if (visitor.ReferencedExpression == null)
         throw new ParseException("Unable to resolve reference to " + reference.Path);
     reference.ReferencedExpression = visitor.ReferencedExpression;
 }
示例#6
0
 /// <summary>
 /// Evaluates the expression and deserializes it.
 /// </summary>
 /// <param name="expression">json object expression</param>
 /// <param name="deserializer">deserializer for deserializing key values</param>
 /// <returns>deserialized object</returns>
 public override object Evaluate(Expression expression, IDeserializerHandler deserializer)
 {
     object value = ConstructObject(CastExpression<ObjectExpression>(expression), deserializer);
     value = Evaluate(expression, value, deserializer);
     if (value is IDeserializationCallback)
         ((IDeserializationCallback)value).OnAfterDeserialization();
     return value;
 }
示例#7
0
 protected virtual void WriteList(Expression Expression)
 {
     ArrayExpression list = (ArrayExpression)Expression;
     jsonWriter.WriteArrayStart();
     foreach (Expression item in list.Items)
         Write(item);
     jsonWriter.WriteArrayEnd();
 }
示例#8
0
 /// <summary>
 /// Evaluates an expression and applies the results to an existing object
 /// </summary>
 /// <param name="Expression">the expression to evaluate</param>
 /// <param name="existingObject">the object to apply to</param>
 /// <returns>the evaluated object</returns>
 public object Evaluate(Expression expression, object existingObject)
 {
     Expression oldExpr = Current;
     _currentExpression = expression;
     IExpressionHandler handler = Config.ExpressionHandlers.GetHandler(expression);
     object result = handler.Evaluate(expression, existingObject, this);
     _currentExpression = oldExpr ?? _currentExpression;
     return result;
 }
示例#9
0
 /// <summary>
 /// Evaluates the expression and populates an existing object with the expression's properties
 /// </summary>
 /// <param name="expression">json object expression</param>
 /// <param name="existingObject">the existing object to populate</param>
 /// <param name="deserializer">deserializer for deserializing key values</param>
 /// <returns>deserialized object</returns>
 public override object Evaluate(Expression expression, object existingObject, IDeserializerHandler deserializer)
 {
     TypeData typeHandler = Config.GetTypeHandler(existingObject.GetType());
     ObjectExpression objectExpression = CastExpression<ObjectExpression>(expression);
     foreach (KeyValueExpression Item in objectExpression.Properties)
     {
         EvaluateItem(existingObject, deserializer, typeHandler, Item);
     }
     return existingObject;
 }
示例#10
0
 public override object Evaluate(Expression expression, IDeserializerHandler deserializer)
 {
     ValueExpression value = CastExpression<ValueExpression>(expression);
     if (value.ResultType.IsEnum)
         return Enum.Parse(value.ResultType, value.StringValue);
     else if (value.ResultType == typeof(object))
         return value.StringValue;
     else if (value.ResultType == typeof(string))
         return value.StringValue;
     else
         return Convert.ChangeType(value.Value, value.ResultType, CultureInfo.InvariantCulture);
 }
示例#11
0
 /// <summary>
 /// Deserializes an expression by populating an existing object collection with the expression's items.
 /// </summary>
 /// <param name="expression">the expression to deserialize</param>
 /// <param name="existingObject">the collection to populate</param>
 /// <param name="deserializer">deserializer to deserialize list items</param>
 /// <returns>deserialized object</returns>
 public override object Evaluate(Expression expression, object existingObject, IDeserializerHandler deserializer)
 {
     Type ItemType;
     ArrayExpression list = (ArrayExpression)expression;
     ICollectionBuilder builder = ConstructBuilder(existingObject, list, out ItemType);
     object result = EvaluateItems(list, builder, ItemType, deserializer);
     if (result is IDeserializationCallback)
     {
         ((IDeserializationCallback)result).OnAfterDeserialization();
     }
     return result;
 }
 /// <summary>
 /// Converts an expression to an object by first Evaluating the expression as its converted type and
 /// then converting that result using the specified type converter.
 /// </summary>
 /// <param name="expression">the expression to convert</param>
 /// <param name="deserializer">deserializer instance</param>
 /// <param name="converter">the converter to use to convert the object</param>
 /// <returns>an object created from the expression</returns>
 public object Evaluate(Expression expression, IDeserializerHandler deserializer, IJsonTypeConverter converter)
 {
     Type sourceType = expression.ResultType;
     Type destType = converter.GetSerializedType(sourceType);
     expression.ResultType = destType;
     object tempResult = deserializer.Evaluate(expression);
     //TODO: Cast for now to avoid breaking compatibility
     object result = converter.ConvertTo(tempResult, sourceType, (SerializationContext) Config);
     expression.OnObjectConstructed(result);
     if (result is IDeserializationCallback)
     {
         ((IDeserializationCallback)result).OnAfterDeserialization();
     }
     return result;
 }
        /// <summary>
        /// Converts an expression to an object by first Evaluating the expression as its converted type and
        /// then converting that result using a type converter.
        /// </summary>
        /// <param name="expression">the expression to convert</param>
        /// <param name="deserializer">deserializer instance</param>
        /// <returns>an object created from the expression</returns>
        public override object Evaluate(Expression expression, IDeserializerHandler deserializer)
        {
            Type sourceType = expression.ResultType;
            TypeData handler = Config.TypeHandlerFactory[sourceType];
            IJsonTypeConverter converter;
            if (typeof(IJsonTypeConverter).IsAssignableFrom(sourceType))
            {
                converter = (IJsonTypeConverter) Activator.CreateInstance(sourceType);
            }
            else
            {
                converter = handler.TypeConverter;
            }

            return Evaluate(expression, deserializer, converter);
        }
示例#14
0
        public override object Evaluate(Expression expression, IDeserializerHandler deserializer)
        {
            DataTable table = new DataTable();
            ObjectExpression tableExpr = (ObjectExpression)expression;
            EvaluateColumns(table, (ArrayExpression)tableExpr["Columns"], deserializer);
            // remove the columns expression, it's been evaluated already
            tableExpr.Properties.RemoveAt(tableExpr.IndexOf("Columns"));

            // now the rows
            EvaluateRows(table, (ArrayExpression)tableExpr["Rows"], deserializer);
            // remove the rows expression, it's been evaluated already
            tableExpr.Properties.RemoveAt(tableExpr.IndexOf("Rows"));

            // fill in any remaining properties
            return base.Evaluate(expression, table, deserializer);
        }
示例#15
0
 public void VisitComplexBase(ComplexExpressionBase expression)
 {
     if (_refID.Top == JsonPath.Root)
     {
         if (expression.Parent != null)
         {
             throw new ArgumentException("Reference for this passed to object that is not at the root", "refID");
         }
     }
     else
     {
         // have to assume that the parent checked that we were the right reference
         // should only get here if we have a parent, if no parent we're not valid
         if (expression.Parent == null)
             throw new ArgumentException("Invalid reference", "refID");
     }
     // it is this object, check if we need to go further
     _refID = _refID.ChildReference();
     if (_refID.IsEmpty) {
         _expr = expression;
     }
 }
示例#16
0
 private static List<ReferenceExpression> CollectReferences(Expression root)
 {
     CollectReferencesVisitor visitor = new CollectReferencesVisitor();
     root.Accept(visitor);
     return visitor.References;
 }
示例#17
0
 /// <summary>
 /// Add a property to this object
 /// </summary>
 /// <param name="key">the key for the property</param>
 /// <param name="value">the value for the property</param>
 /// <returns>KeyValueExpression that was added</returns>
 public KeyValueExpression Add(string key, Expression value)
 {
     return Add(new ValueExpression(key), value);
 }
示例#18
0
 /// <summary>
 /// Converts the expression back into an object
 /// </summary>
 /// <param name="expression">the expression</param>
 /// <param name="deserializer">the deserializer</param>
 /// <returns>null</returns>
 public override object Evaluate(Expression expression, IDeserializerHandler deserializer)
 {
     if (!(expression is NullExpression))
         throw new ArgumentException("expression should be NullExpression");
     return null;
 }
示例#19
0
 /// <summary>
 /// Evaluates an expression and populates an existing object with any necessary values
 /// </summary>
 /// <param name="expression">expression to evaluate</param>
 /// <param name="existingObject">the object to populate</param>
 /// <param name="deserializer">the deserializer instance</param>
 /// <returns>constructed object</returns>
 public override object Evaluate(Expression expression, object existingObject, IDeserializerHandler deserializer)
 {
     Expression innerExpression = ((CastExpression)expression).Expression;
     innerExpression.ResultType = expression.ResultType;
     return deserializer.Evaluate(innerExpression, existingObject);
 }
示例#20
0
 protected virtual void WriteBoolean(Expression expression)
 {
     this.jsonWriter.WriteValue((bool)((BooleanExpression)expression).Value);
 }
示例#21
0
 protected virtual DataColumn EvaluateColumn(Expression colExpr, IDeserializerHandler deserializer)
 {
     colExpr.ResultType = typeof(DataColumn);
     return (DataColumn) deserializer.Evaluate(colExpr);
 }
示例#22
0
 protected virtual void WriteNull(Expression expression)
 {
     if (!(expression is NullExpression))
         throw new ArgumentException("Expression should be a NullExpression");
     jsonWriter.WriteSpecialValue("null");
 }
示例#23
0
 public CastExpression(Type CastedType, Expression Expression)
     : this(CastedType)
 {
     _expression = Expression;
 }
示例#24
0
 protected virtual void WriteNumeric(Expression expression)
 {
     NumericExpression numeric = (NumericExpression)expression;
     object value = numeric.Value;
     switch (Type.GetTypeCode(value.GetType()))
     {
         case TypeCode.Double:
             jsonWriter.WriteValue((double)value);
             break;
         case TypeCode.Single:
             jsonWriter.WriteValue((float)value);
             break;
         case TypeCode.Int64:
             jsonWriter.WriteValue((long)value);
             break;
         case TypeCode.Decimal:
             jsonWriter.WriteValue((decimal)value);
             break;
         case TypeCode.UInt64:
             jsonWriter.WriteSpecialValue(string.Format(CultureInfo.InvariantCulture, "{0}", value));
             break;
         default:
             jsonWriter.WriteValue((long)Convert.ChangeType(value, typeof(long), CultureInfo.InvariantCulture));
             break;
     }
 }
示例#25
0
 /// <summary>
 /// Determines whether this handler can deserialize a specific expression.  The NullExpressionHandler
 /// only handles NullExpressions.
 /// </summary>
 /// <param name="expression">the expression</param>
 /// <returns>true if this handler handles the expression</returns>
 public override bool CanHandle(Expression expression)
 {
     return (expression is NullExpression);
 }
示例#26
0
 private static bool ExpressionEqual(Expression source, Expression target)
 {
     return source == target
            || source is CastExpression && ((CastExpression)source).Expression == target;
 }
示例#27
0
 /// <summary>
 /// Converts an existing object
 /// </summary>
 /// <param name="expression">the expression</param>
 /// <param name="existingObject">an existing object</param>
 /// <param name="deserializer">deserializer</param>
 /// <returns>the existing object</returns>
 public override object Evaluate(Expression expression, object existingObject, IDeserializerHandler deserializer)
 {
     return existingObject;
 }
示例#28
0
 private static Expression GetRealExpression(Expression expression)
 {
     while (expression is CastExpression)
     {
         expression = ((CastExpression)expression).Expression;
     }
     return expression;
 }
示例#29
0
 /// <summary>
 /// Add a property to this object
 /// </summary>
 /// <param name="key">the key for the property</param>
 /// <param name="value">the value for the property</param>
 /// <returns>KeyValueExpression that was added</returns>
 public KeyValueExpression Add(Expression key, Expression value)
 {
     return Add(new KeyValueExpression(key, value));
 }
示例#30
0
        private JsonPath GetPath(Expression expression)
        {
            if (expression.Parent == null)
                return new JsonPath();

            Expression parent = GetRealExpression(expression.Parent);

            if (parent is ComplexExpressionBase)
            {
                ComplexExpressionBase complexParent = (ComplexExpressionBase)parent;
                JsonPath path = GetPath(parent);
                if (parent is ArrayExpression)
                {
                    ArrayExpression parentArray = (ArrayExpression)parent;
                    for (int i = 0; i < parentArray.Items.Count; i++)
                    {
                        if (ExpressionEqual(parentArray.Items[i], expression))
                        {
                            return path.Append(i);
                        }
                    }
                }
                else if (parent is ObjectExpression)
                {
                    ObjectExpression parentObject = (ObjectExpression)parent;
                    foreach (KeyValueExpression kve in parentObject.Properties)
                    {
                        if (ExpressionEqual(kve.KeyExpression, expression)
                            || ExpressionEqual(kve.ValueExpression, expression))
                        {
                            return path.Append(kve.Key);
                        }
                    }
                }
                for (int i = 0; i < complexParent.ConstructorArguments.Count; i++)
                {
                    if (ExpressionEqual(complexParent.ConstructorArguments[i], expression))
                    {
                        return path.Append("carg" + i);
                    }
                }
            }
            return null;
        }