I have a WebMethod that looks like this which is used to populate a jqGrid
[System.Web.Script.Services.ScriptService]
public class MyWebService: System.Web.Services.WebService
{
[WebMethod]
[Authorize(Roles = "Admin")]
public object GetPeople(bool _search, double nd, int rows, int page, string sidx, string sord)
{
var tbl = new DynamicModel("ConnStr", tableName: "Person", primaryKeyField: "ID");
var results = tbl.Paged(orderBy: sidx + " " + sord, currentPage: page, pageSize: rows);
return results;
}
}
"results" is a System.Dynamic.ExpandoObject with the properties Items, TotalPages, TotalRecords
The json I get back on the from the webservice looks like this
{
"d": [{
"Key": "TotalRecords",
"Value": 1
}, {
"Key": "TotalPages",
"Value": 1
}, {
"Key": "Items",
"Value": [
[{
"Key": "Row",
"Value": 1
}, {
"Key": "ID",
"Value": 1
}, {
"Key": "Name",
"Value": "Test Template"
}]
]
}]
}
} // Don't know why firebug put this extra bracket
Ideally I'd prefer that it comes back without all the Key and Value business as it bloats out the json unnecessarily and doesn't play nicely with jqGrid.
Is there a way to change the way ASP.NET is handling the serialization of the ExpandoObject?
It sounds like you've already figured this out, but here's something I threw together a while back to do just that:
public class ExpandoObjectConverter : JavaScriptConverter {
public override IEnumerable<Type> SupportedTypes {
get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(ExpandoObject) })); }
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) {
ExpandoObject expando = (ExpandoObject)obj;
if (expando != null) {
// Create the representation.
Dictionary<string, object> result = new Dictionary<string, object>();
foreach (KeyValuePair<string, object> item in expando) {
if (item.Value.GetType() == typeof(DateTime))
result.Add(item.Key, ((DateTime)item.Value).ToShortDateString());
else
result.Add(item.Key, item.Value.ToString());
}
return result;
}
return new Dictionary<string, object>();
}
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) {
return null;
}
}
Then, you just need to add it to the <converters>
section in your web.config, as shown in the MSDN article you linked to:
<configuration>
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization>
<converters>
<add name="ExpandoObjectConverter" type="ExpandoObjectConverter"/>
</converters>
</jsonSerialization>
</webServices>
</scripting>
</system.web.extensions>
</configuration>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With