Your json string is being HTML encoded. Since you're rendering the json in your view, you can use the @Html.Raw()
helper to prevent it from being encoded.
var data = { json : "@Html.Raw(JsonConvert.SerializeObject(Model))" };
I would recommend using something like ServiceStack or Json.NET for handling Json output in your MVC application. However, you can easily write a class and override the Json method using a base class. See my example below.
NOTE: With this, you do not need anything in your Global.ascx.cs file.
Custom JsonDotNetResult class:
public class JsonDotNetResult : JsonResult
{
private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters = new List<JsonConverter> { new StringEnumConverter() }
};
public override void ExecuteResult(ControllerContext context)
{
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("GET request not allowed");
}
var response = context.HttpContext.Response;
response.ContentType = !string.IsNullOrEmpty(this.ContentType) ? this.ContentType : "application/json";
if (this.ContentEncoding != null)
{
response.ContentEncoding = this.ContentEncoding;
}
if (this.Data == null)
{
return;
}
response.Write(JsonConvert.SerializeObject(this.Data, Settings));
}
}
Base Controller class:
public abstract class Controller : System.Web.Mvc.Controller
{
protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonDotNetResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
}
Now, on your controller action you can simply return something like so.
return Json(myObject, JsonRequestBehavior.AllowGet);
BAM. You now have camelcase Objects returned with Json :)
NOTE: There are ways to do this with Serializer settings on each object that you make with Json. But who would want to type that out every time you want to return Json?
Best Answer
That's because
Point
has defined its ownTypeConverter
and JSON.NET uses it to do the serialization. I'm not sure whether there is a clean way to turn this behavior off, but you can certainly create your ownJsonConverter
that behaves the way you want:You can then use it like this: