Beispiel #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.");
        }
Beispiel #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);

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

            value = GetObject(reader, memberType);

            ((IDictionary)target).Add(memberName, value);
              }
              else
              {
            throw new JsonSerializationException(string.Format("Could not find member '{0}' on object of type '{1}'", memberName, targetType.GetType().Name));
              }
        }
Beispiel #3
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.");
        }
Beispiel #4
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;
        }
Beispiel #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.");
        }
Beispiel #6
0
        private object GetObject(JsonReader reader, Type objectType)
        {
            _level++;

              object value;
              JsonConverter converter;

              if (HasMatchingConverter(objectType, out converter))
              {
            return converter.ReadJson(reader, objectType);
              }
            switch (reader.TokenType)
            {
                // populate a typed object or generic dictionary/array
                // depending upon whether an objectType was supplied
            case JsonToken.StartObject:
                value = (objectType != null) ? PopulateObject(reader, objectType) : PopulateJavaScriptObject(reader);
                break;
            case JsonToken.StartArray:
                value = (objectType != null) ? PopulateList(reader, objectType) : PopulateJavaScriptArray(reader);
                break;
            case JsonToken.Integer:
            case JsonToken.Float:
            case JsonToken.String:
            case JsonToken.Boolean:
            case JsonToken.Date:
                value = EnsureType(reader.Value, objectType);
                break;
            case JsonToken.Constructor:
                value = reader.Value.ToString();
                break;
            case JsonToken.Null:
            case JsonToken.Undefined:
                value = null;
                break;
            default:
                throw new JsonSerializationException("Unexpected token whil deserializing object: " + reader.TokenType);
            }

            _level--;

              return value;
        }
Beispiel #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);
        }
Beispiel #8
0
 /// <summary>
 /// Deserializes the Json structure contained by the specified <see cref="JsonReader"/>.
 /// </summary>
 /// <param name="reader">The <see cref="JsonReader"/> that contains the Json structure to deserialize.</param>
 /// <returns>The <see cref="Object"/> being deserialized.</returns>
 public object Deserialize(JsonReader reader)
 {
     return Deserialize(reader, null);
 }
Beispiel #9
0
 ///<summary>
 ///</summary>
 ///<param name="reader"></param>
 ///<param name="objectType"></param>
 ///<returns></returns>
 ///<exception cref="NotImplementedException"></exception>
 public virtual object ReadJson(JsonReader reader, Type objectType)
 {
     throw new NotImplementedException(string.Format("{0} has not overriden FromJson method.", GetType().Name));
 }