a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
74 lines
2.8 KiB
C#
74 lines
2.8 KiB
C#
namespace System.Web.Mvc {
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Web.Script.Serialization;
|
|
|
|
public sealed class JsonValueProviderFactory : ValueProviderFactory {
|
|
|
|
private static void AddToBackingStore(Dictionary<string, object> backingStore, string prefix, object value) {
|
|
IDictionary<string, object> d = value as IDictionary<string, object>;
|
|
if (d != null) {
|
|
foreach (KeyValuePair<string, object> entry in d) {
|
|
AddToBackingStore(backingStore, MakePropertyKey(prefix, entry.Key), entry.Value);
|
|
}
|
|
return;
|
|
}
|
|
|
|
IList l = value as IList;
|
|
if (l != null) {
|
|
for (int i = 0; i < l.Count; i++) {
|
|
AddToBackingStore(backingStore, MakeArrayKey(prefix, i), l[i]);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// primitive
|
|
backingStore[prefix] = value;
|
|
}
|
|
|
|
private static object GetDeserializedObject(ControllerContext controllerContext) {
|
|
if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) {
|
|
// not JSON request
|
|
return null;
|
|
}
|
|
|
|
StreamReader reader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
|
|
string bodyText = reader.ReadToEnd();
|
|
if (String.IsNullOrEmpty(bodyText)) {
|
|
// no JSON data
|
|
return null;
|
|
}
|
|
|
|
JavaScriptSerializer serializer = new JavaScriptSerializer();
|
|
object jsonData = serializer.DeserializeObject(bodyText);
|
|
return jsonData;
|
|
}
|
|
|
|
public override IValueProvider GetValueProvider(ControllerContext controllerContext) {
|
|
if (controllerContext == null) {
|
|
throw new ArgumentNullException("controllerContext");
|
|
}
|
|
|
|
object jsonData = GetDeserializedObject(controllerContext);
|
|
if (jsonData == null) {
|
|
return null;
|
|
}
|
|
|
|
Dictionary<string, object> backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
|
|
AddToBackingStore(backingStore, String.Empty, jsonData);
|
|
return new DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture);
|
|
}
|
|
|
|
private static string MakeArrayKey(string prefix, int index) {
|
|
return prefix + "[" + index.ToString(CultureInfo.InvariantCulture) + "]";
|
|
}
|
|
|
|
private static string MakePropertyKey(string prefix, string propertyName) {
|
|
return (String.IsNullOrEmpty(prefix)) ? propertyName : prefix + "." + propertyName;
|
|
}
|
|
}
|
|
}
|