/// <summary>
        /// Deserialize an object.
        /// </summary>
        /// <param name="type">The type of the object to deserialize.</param>
        /// <param name="fieldNamingStrategy">The field naming strategy that is being used for the scope of the request.</param>
        /// <param name="jsonValue">The JSON value that represents the object to deserialize.</param>
        protected override object DeserializeValue(Type type, IFieldNamingStrategy fieldNamingStrategy, JsonValue jsonValue)
        {
            var jsonObject = jsonValue as JsonObject;

            if (jsonObject == null)
            {
                throw new HypermediaAspNetCoreException("The top level JSON value must be an Object.");
            }

            var serializer = CreateJsonApiSerializer(fieldNamingStrategy);

            if (TypeHelper.IsEnumerable(type))
            {
                var collection = TypeHelper.CreateListInstance(type);

                foreach (var item in serializer.DeserializeMany(jsonObject))
                {
                    collection.Add(item);
                }

                return(collection);
            }

            return(serializer.Deserialize(jsonObject));
        }
Esempio n. 2
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="contractResolver">The contractor resolver.</param>
        /// <param name="fieldNamingStratgey">The field naming strategy that is in use.</param>
        /// <param name="jsonValue">The root document node.</param>
        public JsonPatch(IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStratgey, JsonValue jsonValue)
        {
            _fieldNamingStratgey = fieldNamingStratgey;
            _jsonValue           = jsonValue;

            ContractResolver = contractResolver;
        }
Esempio n. 3
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="mediaTypeName">The media type name that the output is handling.</param>
        /// <param name="contractResolver">The contract resolver to use.</param>
        /// <param name="fieldNamingStrategy">The field naming strategy when serializing and deserializing the JSON.</param>
        protected JsonOutputFormatter(string mediaTypeName, IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStrategy) : base(contractResolver)
        {
            SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse(mediaTypeName));

            SupportedEncodings.Add(Encoding.UTF8);
            SupportedEncodings.Add(Encoding.Unicode);

            FieldNamingStrategy = fieldNamingStrategy;
        }
Esempio n. 4
0
        /// <summary>
        /// Read an object from the given JSON value.
        /// </summary>
        /// <param name="type">The type of the object to deserialize.</param>
        /// <param name="fieldNamingStrategy">The field naming strategy that is being used for the scope of the request.</param>
        /// <param name="jsonValue">The JSON value to read.</param>
        /// <returns>The object that was read.</returns>
        protected virtual object ReadFromJsonValue(Type type, IFieldNamingStrategy fieldNamingStrategy, JsonValue jsonValue)
        {
            if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IPatch <>))
            {
                return(CreatePatch(type, ContractResolver, fieldNamingStrategy, jsonValue));
            }

            return(DeserializeValue(type, fieldNamingStrategy, jsonValue));
        }
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="name">The friendly name of the format.</param>
 /// <param name="mediaTypeName">The correct media type name for content negotiation.</param>
 /// <param name="contractResolver">The resource contract resolver used to resolve the contracts at runtime.</param>
 /// <param name="fieldNamingStratgey">The field naming strategy to use.</param>
 /// <param name="outputFormatter">The output formatter to apply when writing the output.</param>
 protected JsonMediaTypeFormatter(
     string name,
     string mediaTypeName,
     IContractResolver contractResolver,
     IFieldNamingStrategy fieldNamingStratgey,
     IJsonOutputFormatter outputFormatter) : base(name, mediaTypeName, contractResolver)
 {
     FieldNamingStrategy = fieldNamingStratgey;
     OutputFormatter     = outputFormatter;
 }
Esempio n. 6
0
        /// <summary>
        /// Serialize the value into an JSON AST.
        /// </summary>
        /// <param name="type">The type to serialize from.</param>
        /// <param name="value">The value to serialize.</param>
        /// <param name="fieldNamingStrategy">The field naming strategy when serializing and deserializing the JSON.</param>
        /// <returns>The JSON object that represents the serialized value.</returns>
        protected virtual JsonValue SerializeValue(Type type, object value, IFieldNamingStrategy fieldNamingStrategy)
        {
            var serializer = new JsonSerializer(
                new JsonConverterFactory(
                    JsonConverterFactory.Default,
                    new ContractConverter(ContractResolver, fieldNamingStrategy),
                    new ComplexConverter(fieldNamingStrategy)));

            return(serializer.SerializeValue(value));
        }
Esempio n. 7
0
        /// <summary>
        /// Deserialize an object.
        /// </summary>
        /// <param name="type">The type of the object to deserialize.</param>
        /// <param name="fieldNamingStrategy">The field naming strategy that is being used for the scope of the request.</param>
        /// <param name="jsonValue">The JSON value that represents the object to deserialize.</param>
        protected virtual object DeserializeValue(Type type, IFieldNamingStrategy fieldNamingStrategy, JsonValue jsonValue)
        {
            var serializer = new JsonSerializer(
                new JsonConverterFactory(
                    JsonConverterFactory.DefaultConverters.Union(
                        new ContractConverter(ContractResolver, fieldNamingStrategy),
                        new ComplexConverter(fieldNamingStrategy)
                        )));

            return(serializer.DeserializeValue(type, jsonValue));
        }
        /// <summary>
        /// Serialize the value into an JSON AST.
        /// </summary>
        /// <param name="type">The type to serialize from.</param>
        /// <param name="value">The value to serialize.</param>
        /// <param name="fieldNamingStrategy">The field naming strategy when serializing and deserializing the JSON.</param>
        /// <returns>The JSON object that represents the serialized value.</returns>
        JsonValue SerializeContract(Type type, object value, IFieldNamingStrategy fieldNamingStrategy)
        {
            var serializer = CreateJsonApiSerializer(fieldNamingStrategy);

            if (TypeHelper.IsEnumerable(type))
            {
                return(serializer.SerializeMany((IEnumerable)value));
            }

            return(serializer.SerializeEntity(value));
        }
        /// <summary>
        /// Create an instance of a serializer with the specified field naming strategy as an override.
        /// </summary>
        /// <param name="fieldNamingStrategy">The field naming strategy to override with.</param>
        /// <returns>The serializer instance to use.</returns>
        JsonApiSerializer CreateJsonApiSerializer(IFieldNamingStrategy fieldNamingStrategy)
        {
            if (_serializerOptions.FieldNamingStrategy == fieldNamingStrategy)
            {
                return(new JsonApiSerializer(_serializerOptions));
            }

            var serializerOptions = _serializerOptions.Clone();

            serializerOptions.FieldNamingStrategy = fieldNamingStrategy;

            return(new JsonApiSerializer(serializerOptions));
        }
        /// <summary>
        /// Serialize the value into an JSON AST.
        /// </summary>
        /// <param name="type">The type to serialize from.</param>
        /// <param name="value">The value to serialize.</param>
        /// <param name="fieldNamingStrategy">The field naming strategy when serializing and deserializing the JSON.</param>
        /// <returns>The JSON object that represents the serialized value.</returns>
        protected override JsonValue SerializeValue(Type type, object value, IFieldNamingStrategy fieldNamingStrategy)
        {
            if (ContractResolver.CanResolve(TypeHelper.GetUnderlyingType(type)))
            {
                return(SerializeContract(type, value, fieldNamingStrategy));
            }

            if (TypeHelper.GetUnderlyingType(type) == typeof(JsonApiError))
            {
                return(SerializeJsonApiError(type, value));
            }

            throw new HypermediaException("Not supported.");
        }
Esempio n. 11
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="fieldNamingStrategy">The field naming strategy.</param>
 public JsonSerializer(IFieldNamingStrategy fieldNamingStrategy)
 {
     _jsonConverterFactory = new JsonConverterFactory(
         JsonConverterFactory.Default,
         new ComplexConverter(fieldNamingStrategy));
 }
Esempio n. 12
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="fieldNamingStrategy">The field naming strategy.</param>
 public ComplexConverter(IFieldNamingStrategy fieldNamingStrategy)
 {
     _fieldNamingStrategy = fieldNamingStrategy;
 }
        /// <summary>
        /// Configures MVC to use the Hypermedia formatters.
        /// </summary>
        /// <param name="builder">The builder to configure the options on.</param>
        /// <param name="contractResolver">The contract resolver to use for the formatters.</param>
        /// <param name="fieldNamingStrategy">The field naming strategy to use by default.</param>
        /// <returns>The builder to continue building on.</returns>
        public static IMvcBuilder AddHypermediaFormatters(this IMvcBuilder builder, IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStrategy)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            if (contractResolver == null)
            {
                throw new ArgumentNullException(nameof(contractResolver));
            }

            return(AddHypermediaFormatters(builder,
                                           options =>
            {
                options.ContractResolver = contractResolver;
                options.FieldNamingStrategy = fieldNamingStrategy;
            }));
        }
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The resource contract resolver used to resolve the contracts at runtime.</param>
 /// <param name="fieldNamingStratgey">The field naming strategy to use.</param>
 /// <param name="outputFormatter">The output formatter to apply when writing the output.</param>
 public JsonMediaTypeFormatter(
     IContractResolver contractResolver,
     IFieldNamingStrategy fieldNamingStratgey,
     IJsonOutputFormatter outputFormatter) : this(Name, MediaTypeName, contractResolver, fieldNamingStratgey, outputFormatter)
 {
 }
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The resource contract resolver used to resolve the contracts at runtime.</param>
 /// <param name="fieldNamingStratgey">The field naming strategy to use.</param>
 public JsonMediaTypeFormatter(IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStratgey) : this(Name, MediaTypeName, contractResolver, fieldNamingStratgey, DefaultJsonOutputFormatter.Instance)
 {
 }
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The resource contract resolver used to resolve the contracts at runtime.</param>
 /// <param name="fieldNamingStratgey">The field naming strategy to use.</param>
 /// <param name="prettify">A value which indicates whether the output should be prettified.</param>
 JsonApiMediaTypeFormatter(IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStratgey, bool prettify)
     : base(Name, MediaTypeName, contractResolver, prettify)
 {
     _fieldNamingStratgey = fieldNamingStratgey;
 }
Esempio n. 17
0
		/// <summary>
		/// Initializes a new instance of <see cref="NoSetterAccessor"/>.
		/// </summary>
		/// <param name="namingStrategy">The <see cref="IFieldNamingStrategy"/> to use.</param>
		public NoSetterAccessor(IFieldNamingStrategy namingStrategy)
		{
			this.namingStrategy = namingStrategy;
		}
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The resource contract resolver used to resolve the contracts at runtime.</param>
 /// <param name="fieldNamingStratgey">The field naming strategy to use.</param>
 public JsonApiMediaTypeFormatter(IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStratgey) : this(contractResolver, fieldNamingStratgey, false)
 {
 }
Esempio n. 19
0
        /// <summary>
        /// Creates an instance of the patch object for the media type.
        /// </summary>
        /// <param name="type">The type of the inner instance that is being patched.</param>
        /// <param name="contractResolver">The contract resolver.</param>
        /// <param name="fieldNamingStrategy">The field naming strategy that is being used for the scope of the request.</param>
        /// <param name="jsonValue">The JSON value that represents the patch values.</param>
        /// <returns>The instance of the patch.</returns>
        protected virtual IPatch CreatePatch(Type type, IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStrategy, JsonValue jsonValue)
        {
            var patch = typeof(JsonPatch <>).MakeGenericType(type.GenericTypeArguments[0]);

            var constructor = patch.GetConstructor(new[] { typeof(IContractResolver), typeof(IFieldNamingStrategy), typeof(JsonObject) });

            Debug.Assert(constructor != null);

            return((IPatch)constructor.Invoke(new object[] { ContractResolver, fieldNamingStrategy, jsonValue }));
        }
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The contract resolver.</param>
 /// <param name="fieldNamingStrategy">The field naming strategy.</param>
 public ContractConverter(IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStrategy)
 {
     _contractResolver    = contractResolver;
     _fieldNamingStrategy = fieldNamingStrategy;
 }
Esempio n. 21
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The resource contract resolver used to resolve the contracts at runtime.</param>
 /// <param name="fieldNamingStratgey">The field naming strategy to use.</param>
 /// <param name="outputFormatter">The output formatter to apply when writing the output.</param>
 public JsonApiMetadataMediaTypeFormatter(
     IContractResolver contractResolver,
     IFieldNamingStrategy fieldNamingStratgey,
     IJsonOutputFormatter outputFormatter) : base(contractResolver, fieldNamingStratgey, outputFormatter)
 {
 }
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The resource contract resolver used to resolve the contracts at runtime.</param>
 /// <param name="fieldNamingStratgey">The field naming strategy to use.</param>
 /// <param name="outputFormatter">The output formatter to apply when writing the output.</param>
 JsonApiMediaTypeFormatter(
     IContractResolver contractResolver,
     IFieldNamingStrategy fieldNamingStratgey,
     IJsonOutputFormatter outputFormatter) : base(Name, MediaTypeName, contractResolver, fieldNamingStratgey, outputFormatter)
 {
 }
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The resource contract resolver used to resolve the contracts at runtime.</param>
 /// <param name="fieldNamingStratgey">The field naming strategy to use.</param>
 /// <param name="prettify">A value which indicates whether the output should be prettified.</param>
 JsonApiMediaTypeFormatter(IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStratgey, bool prettify) : base(Name, MediaTypeName, contractResolver, prettify)
 {
     _fieldNamingStratgey = fieldNamingStratgey;
 }
Esempio n. 24
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The contract resolver to use.</param>
 /// <param name="fieldNamingStrategy">The field naming strategy when serializing and deserializing the JSON.</param>
 public JsonOutputFormatter(IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStrategy) : this(JsonMediaTypeName, contractResolver, fieldNamingStrategy)
 {
 }
Esempio n. 25
0
		/// <summary>
		/// Initializes a new instance of <see cref="FieldAccessor"/>.
		/// </summary>
		/// <param name="namingStrategy">The <see cref="IFieldNamingStrategy"/> to use.</param>
		public FieldAccessor(IFieldNamingStrategy namingStrategy)
		{
			this.namingStrategy = namingStrategy;
		}
Esempio n. 26
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="jsonConverterFactory">The JSON converter factory.</param>
 /// <param name="fieldNamingStrategy">The field naming strategy.</param>
 public JsonSerializer(IJsonConverterFactory jsonConverterFactory, IFieldNamingStrategy fieldNamingStrategy)
 {
     JsonConverterFactory = jsonConverterFactory;
     FieldNamingStrategy = fieldNamingStrategy;
 }
Esempio n. 27
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="jsonConverterFactory">The JSON converter factory.</param>
 /// <param name="fieldNamingStrategy">The field naming strategy.</param>
 public Serializer(IJsonConverterFactory jsonConverterFactory, IFieldNamingStrategy fieldNamingStrategy)
 {
     JsonConverterFactory = jsonConverterFactory;
     FieldNamingStrategy  = fieldNamingStrategy;
 }
 /// <summary>
 /// Initializes a new instance of <see cref="NoSetterAccessor"/>.
 /// </summary>
 /// <param name="namingStrategy">The <see cref="IFieldNamingStrategy"/> to use.</param>
 public NoSetterAccessor(IFieldNamingStrategy namingStrategy)
 {
     this.namingStrategy = namingStrategy;
 }
Esempio n. 29
0
 /// <summary>
 /// Initializes a new instance of <see cref="FieldAccessor"/>.
 /// </summary>
 /// <param name="namingStrategy">The <see cref="IFieldNamingStrategy"/> to use.</param>
 public FieldAccessor(IFieldNamingStrategy namingStrategy)
 {
     this.namingStrategy = namingStrategy;
 }
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="contractResolver">The resource contract resolver used to resolve the contracts at runtime.</param>
 /// <param name="fieldNamingStratgey">The field naming strategy to use.</param>
 public JsonApiMediaTypeFormatter(IContractResolver contractResolver, IFieldNamingStrategy fieldNamingStratgey)
     : this(contractResolver, fieldNamingStratgey, false)
 {
 }