Exemplo n.º 1
0
        private object PopulateObject(JsonReader reader, Type objectType)
        {
            object newObject = Activator.CreateInstance(objectType);

              while (reader.Read())
              {
            switch (reader.TokenType)
            {
              case JsonToken.PropertyName:
            string memberName = reader.Value.ToString();

            SetObjectMember(reader, newObject, objectType, memberName);
            break;
              case JsonToken.EndObject:
            return newObject;
              default:
            throw new JsonSerializationException("Unexpected token when deserializing object: " + reader.TokenType);
            }
              }

              throw new JsonSerializationException("Unexpected end when deserializing object.");
        }
Exemplo n.º 2
0
        private void SetObjectMember(JsonReader reader, object target, Type targetType, string memberName)
        {
            if (!reader.Read())
            throw new JsonSerializationException(string.Format("Unexpected end when setting {0}'s value.", memberName));

              MemberMappingCollection memberMappings = GetMemberMappings(targetType);
              Type memberType;
              object value;

              // test if a member with memberName exists on the type
              // otherwise test if target is a dictionary and assign value with the key if it is
              if (memberMappings.Contains(memberName))
              {
            MemberMapping memberMapping = memberMappings[memberName];

            if (memberMapping.Ignored)
              return;

            // ignore member if it is readonly
            if (!memberMapping.Writable)
              return;

            // get the member's underlying type
            memberType = ReflectionUtils.GetMemberUnderlyingType(memberMapping.Member);

            value = GetObject(reader, memberType);

            if (_nullValueHandling == NullValueHandling.Ignore && value == null)
              return;

            ReflectionUtils.SetMemberValue(memberMapping.Member, target, value);
              }
              else if (typeof(IDictionary).IsAssignableFrom(targetType))
              {
            // attempt to get the IDictionary's type
            memberType = ReflectionUtils.GetDictionaryValueType(targetType);
            value = GetObject(reader, memberType);

            Type keyType = ReflectionUtils.GetDictionaryKeyType(targetType);
            object keyValue = EnsureType(memberName, keyType);

            ((IDictionary)target).Add(keyValue, value);
              }
              else
              {
            if (_missingMemberHandling == MissingMemberHandling.Error)
              throw new JsonSerializationException(string.Format("Could not find member '{0}' on object of type '{1}'", memberName, targetType.GetType().Name));
              }
        }
Exemplo n.º 3
0
        private object PopulateList(JsonReader reader, Type objectType)
        {
            Type elementType = ReflectionUtils.GetListItemType(objectType);

              IList populatedList = CollectionUtils.CreateAndPopulateList(objectType, delegate(IList list)
            {
              while (reader.Read())
              {
            switch (reader.TokenType)
            {
              case JsonToken.EndArray:
                return;
              case JsonToken.Comment:
                break;
              default:
                object value = GetObject(reader, elementType);

                list.Add(value);
                break;
            }
              }

              throw new JsonSerializationException("Unexpected end when deserializing array.");
            });

              return populatedList;
        }
Exemplo n.º 4
0
        private JavaScriptObject PopulateJavaScriptObject(JsonReader reader)
        {
            JavaScriptObject jsObject = new JavaScriptObject();

              while (reader.Read())
              {
            switch (reader.TokenType)
            {
              case JsonToken.PropertyName:
            string memberName = reader.Value.ToString();

            // move to the value token. skip comments
            do
            {
              if (!reader.Read())
                throw new JsonSerializationException("Unexpected end while deserializing object.");
            } while (reader.TokenType == JsonToken.Comment);

            object value = GetObject(reader, null);

            jsObject[memberName] = value;
            break;
              case JsonToken.EndObject:
            return jsObject;
              case JsonToken.Comment:
            break;
              default:
            throw new JsonSerializationException("Unexpected token while deserializing object: " + reader.TokenType);
            }
              }

              throw new JsonSerializationException("Unexpected end while deserializing object.");
        }
Exemplo n.º 5
0
        private JavaScriptArray PopulateJavaScriptArray(JsonReader reader)
        {
            JavaScriptArray jsArray = new JavaScriptArray();

              while (reader.Read())
              {
            switch (reader.TokenType)
            {
              case JsonToken.EndArray:
            return jsArray;
              case JsonToken.Comment:
            break;
              default:
            object value = GetObject(reader, null);

            jsArray.Add(value);
            break;
            }
              }

              throw new JsonSerializationException("Unexpected end while deserializing array.");
        }
Exemplo n.º 6
0
        private DateTime CreateDate(JsonReader reader)
        {
            // move to parameter
              if (!reader.Read())
            throw new JsonSerializationException("Unexpected end while creating date.");

              //TODO: add support for Date constructor with multiple arguments
              long ticks = Convert.ToInt64(reader.Value);
              DateTime date = JavaScriptConvert.ConvertJavaScriptTicksToDateTime(ticks);

              // move to constructor end
              if (!reader.Read())
            throw new JsonSerializationException("Unexpected end while creating date.");
              if (reader.TokenType != JsonToken.EndConstructor)
            throw new JsonSerializationException("Unexpected token while creating date: " + reader.TokenType);

              return date;
        }
Exemplo n.º 7
0
        /// <summary>
        /// Deserializes the Json structure contained by the specified <see cref="JsonReader"/>
        /// into an instance of the specified type.
        /// </summary>
        /// <param name="reader">The type of object to create.</param>
        /// <param name="objectType">The <see cref="Type"/> of object being deserialized.</param>
        /// <returns>The instance of <paramref name="objectType"/> being deserialized.</returns>
        public object Deserialize(JsonReader reader, Type objectType)
        {
            if (reader == null)
            throw new ArgumentNullException("reader");

              if (!reader.Read())
            return null;

              return GetObject(reader, objectType);
        }