JsonResult is equivalent to [DataMember (Name = "Test")]

I have a way:

public JsonResult Layar(string countryCode, string timestamp, string userId, string developerId, string layarName, double radius, double lat, double lon, double accuracy) { LayarModel model = new LayarModel(lat, lon, radius); return Json(model, JsonRequestBehavior.AllowGet); } 

It returns this object:

 public class LayarModel { private List<HotSpot> _hotSpots = new List<HotSpot>(); public List<HotSpot> HotSpots { get { return _hotSpots; } set { _hotSpots = value; } } public string Name { get; set; } public int ErrorCode { get; set; } public string ErrorString { get; set; } } 

I want JSON to be

 {"hotspots": [{ "distance": 100, "attribution": "The Location of the Layar Office", "title": "The Layar Office", "lon": 4884339, "imageURL": http:\/\/custom.layar.nl\/layarimage.jpeg, "line4": "1019DW Amsterdam", "line3": "distance:%distance%", "line2": "Rietlandpark 301", "actions": [], "lat": 52374544, "type": 0, "id": "test_1"}], "layer": "snowy4", "errorString": "ok", "morePages": false, "errorCode": 0, "nextPageKey": null } 

Everything comes out in capital letters, as in the returned class ( HotSpots instead of HotSpots ).

I tried DataContract and DataMembers (Name = "Test"), but this does not work. Any suggestions?

+4
source share
2 answers

JsonResult () uses the JavaScriptSerializer to serialize, and it doesn't seem to support defining serialized property names using attributes.

DataContractJsonSerializer supports this, so this may be the way.

Some links that may be helpful:

+1
source

I would also recommend installing json.NET, but the rest is much simpler. Below is the extension method that I am using in my current application to provide better reuse, feel free to adapt it to your needs, but it should do what you need right out of the box.

 public class JsonNetResult : ActionResult { public Encoding ContentEncoding { get; set; } public string ContentType { get; set; } public object Data { get; set; } public JsonSerializerSettings SerializerSettings { get; set; } public Formatting Formatting { get; set; } public JsonNetResult() { SerializerSettings = new JsonSerializerSettings { //http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx #if DEBUG Formatting = Formatting.Indented, //Makes the outputted Json easier reading by a human, only needed in debug #endif ContractResolver = new CamelCasePropertyNamesContractResolver() //Makes the default for properties outputted by Json to use camelCaps }; } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); HttpResponseBase response = context.HttpContext.Response; response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) response.ContentEncoding = ContentEncoding; if (Data != null) { JsonTextWriter writer = new JsonTextWriter(response.Output) {Formatting = Formatting}; JsonSerializer serializer = JsonSerializer.Create(SerializerSettings); serializer.Serialize(writer, Data); writer.Flush(); } } } public static class JsonNetExtenionMethods { public static ActionResult JsonNet(this Controller controller, object data) { return new JsonNetResult() {Data = data}; } public static ActionResult JsonNet(this Controller controller, object data, string contentType) { return new JsonNetResult() { Data = data, ContentType = contentType }; } public static ActionResult JsonNet(this Controller controller, object data, Formatting formatting) { return new JsonNetResult() {Data = data, Formatting = formatting}; } } 

Here is an example of its use.

 public JsonNetResult Layar(string countryCode, string timestamp, string userId, string developerId, string layarName, double radius, double lat, double lon, double accuracy) { LayarModel model = new LayarModel(lat, lon, radius); return this.JsonNet(model); } 

A note that solves your problem specifically is when ContractResolver in JsonSerializerSettings uses new CamelCasePropertyNamesContractResolver()

Thus, you no longer need to set an individual name.

0
source

All Articles